Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Binary file modified Content/BP/DataAsset/Artifact/DA_Artifact_A047_MagicHat.uasset
Binary file not shown.
Binary file modified Content/BP/DataAsset/Artifact/DA_Artifact_A048_Inkpot.uasset
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added Content/BP/ReleaseIcons/T_Beta15_Cheat.uasset
Binary file not shown.
Binary file not shown.
Binary file added Content/BP/ReleaseIcons/T_Beta15_Inkpot.uasset
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified Content/Localization/Game/Game.manifest
Binary file not shown.
Binary file modified Content/Localization/Game/en/Game.archive
Binary file not shown.
Binary file modified Content/Localization/Game/en/Game.locres
Binary file not shown.
771 changes: 480 additions & 291 deletions Content/Localization/Game/en/Game.po

Large diffs are not rendered by default.

Binary file modified Content/Localization/Game/ko/Game.archive
Binary file not shown.
Binary file modified Content/Localization/Game/ko/Game.locres
Binary file not shown.
773 changes: 481 additions & 292 deletions Content/Localization/Game/ko/Game.po

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ int32 URefreshPullDescriptionsCommandlet::Main(const FString& Params)
{
FInternationalization::Get().SetCurrentCulture(TEXT("ko"));
const bool bApply = FParse::Param(*Params, TEXT("Apply"));
FString SelectedAsset;
FParse::Value(*Params, TEXT("Asset="), SelectedAsset);
auto& Registry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")).Get();
Registry.ScanPathsSynchronous({TEXT("/Game/BP/DataAsset/Skill")}, true);
TArray<FAssetData> Assets;
Expand All @@ -27,12 +29,17 @@ int32 URefreshPullDescriptionsCommandlet::Main(const FString& Params)
for (const FAssetData& Asset : Assets)
{
auto* Skill = Cast<UStaticSkillData>(Asset.GetAsset());
if (!Skill || !Skill->mDescription.ToString().Contains(TEXT("대상을 시전자 옆까지 끌어옵니다."))) continue;
if (!Skill) continue;
if (!SelectedAsset.IsEmpty())
{
if (Skill->GetPathName() != SelectedAsset) continue;
}
else if (!Skill->mDescription.ToString().Contains(TEXT("대상을 시전자 옆까지 끌어옵니다."))) continue;
bool bHasPull = false;
for (const auto& Phase : Skill->mSkillPhaseLayers)
for (const auto& Layer : Phase.mSkillEffectLayers)
bHasPull |= Layer.IsValid() && Layer.GetScriptStruct()->IsChildOf(FSkillEffectLayer_Pull::StaticStruct());
if (!bHasPull) continue;
if (SelectedAsset.IsEmpty() && !bHasPull) continue;
const FText Description = Skill->MakeDescription();
if (Description.IsEmpty() || Description.ToString().Contains(TEXT("대상을 시전자 옆까지 끌어옵니다."))) return 1;
UE_LOG(LogTemp, Display, TEXT("RefreshPullDescriptions %s: %s -> %s"),
Expand All @@ -46,5 +53,5 @@ int32 URefreshPullDescriptionsCommandlet::Main(const FString& Params)
++Changed;
}
UE_LOG(LogTemp, Display, TEXT("RefreshPullDescriptions: %d %s"), Changed, bApply ? TEXT("saved") : TEXT("would change"));
return 0;
return !SelectedAsset.IsEmpty() && Changed != 1 ? 1 : 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "RefreshPullDescriptionsCommandlet.generated.h"

// Preview stale generated pull descriptions; pass -Apply to save replacements.
// Use -Asset=<full object path> to regenerate one explicitly selected skill.
UCLASS()
class URefreshPullDescriptionsCommandlet : public UCommandlet
{
Expand Down
Binary file added SourceArt/UI/ReleaseIcons/BlessingOfTime.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added SourceArt/UI/ReleaseIcons/BrokenClock.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added SourceArt/UI/ReleaseIcons/Cheat.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added SourceArt/UI/ReleaseIcons/HourglassTurn.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added SourceArt/UI/ReleaseIcons/Inkpot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added SourceArt/UI/ReleaseIcons/MagicHat.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added SourceArt/UI/ReleaseIcons/TickTock.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions Tools/Localization/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ svnversion .\Content\SVN

## 에셋 이름 변경

특정 스킬에 예전 FText 원문이 저장된 경우에는 `-run=RefreshPullDescriptions -Asset=<전체 오브젝트 경로> -Apply`로 해당 스킬의 설명만 재생성할 수 있습니다. 예: `-Asset=/Game/BP/DataAsset/Skill/Mercenary/Rogue/DA_Rogue_Attack_Rare_SharpenBlade.DA_Rogue_Attack_Rare_SharpenBlade`. 대상이 없으면 실패하며, `-Apply`를 생략하면 미리보기만 수행합니다.

파일 탐색기에서 `.uasset` 이름만 바꾸지 말고 Unreal Editor의 이름 변경 기능을 사용합니다. 저장된 참조를 갱신하고 이전 redirector의 참조가 남지 않았는지 확인한 다음 번역을 재수집합니다.

이미 배포한 스킬의 에셋 이름을 바꾼 경우에는 저장된 `FPrimaryAssetId`도 고려해야 합니다. 골렘의 `DA_Goelm_*` → `DA_Golem_*` 변경은 `DefaultGame.ini`의 `PrimaryAssetIdRedirects`로 이전 ID를 유지하며, `GolemSkillReferences` 테스트가 실제 에셋 및 유닛 참조와 함께 검사합니다.
51 changes: 51 additions & 0 deletions Tools/import_release_icons.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""Import beta 15 icons and bind the eight new production data assets."""
from pathlib import Path
import json
import unreal

unreal.SystemLibrary.execute_console_command(None, 'Interchange.FeatureFlags.Import.PNG 0')
source = Path(unreal.Paths.project_dir()) / 'SourceArt/UI/ReleaseIcons'
destination = '/Game/BP/ReleaseIcons'
targets = [
('BrokenClock', '/Game/BP/DataAsset/Artifact/DA_Artifact_A046_BrokenClock'),
('MagicHat', '/Game/BP/DataAsset/Artifact/DA_Artifact_A047_MagicHat'),
('Inkpot', '/Game/BP/DataAsset/Artifact/DA_Artifact_A048_Inkpot'),
('HourglassTurn', '/Game/BP/DataAsset/Skill/Common/DA_Common_Spell_Epic_HourglassTurn'),
('BlessingOfTime', '/Game/BP/DataAsset/Skill/Mercenary/Druid/DA_Druid_Spell_Epic_BlessingOfTime'),
('TickTock', '/Game/BP/DataAsset/Skill/Mercenary/Mage/DA_Mage_Spell_Epic_TickTock'),
('TimeAcceleration', '/Game/BP/DataAsset/Skill/Mercenary/Mage/DA_Mage_Spell_Rare_TimeAcceleration'),
('Cheat', '/Game/BP/DataAsset/Skill/Mercenary/Rogue/DA_Rogue_Spell_Epic_Cheat'),
]
report = []
for name, asset_path in targets:
filename = source / (name + '.png')
data = unreal.load_asset(asset_path)
if not filename.is_file() or data is None:
raise RuntimeError('Missing source image or data asset: ' + name)
task = unreal.AssetImportTask()
task.filename = str(filename)
task.destination_path = destination
task.destination_name = 'T_Beta15_' + name
task.automated = True
task.factory = unreal.TextureFactory()
task.replace_existing = True
task.save = False
unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task])
texture = unreal.load_asset(destination + '/' + task.destination_name)
if not isinstance(texture, unreal.Texture2D):
raise RuntimeError('Texture import failed: ' + name)
texture.set_editor_property('compression_settings', unreal.TextureCompressionSettings.TC_EDITOR_ICON)
texture.set_editor_property('lod_group', unreal.TextureGroup.TEXTUREGROUP_UI)
texture.set_editor_property('mip_gen_settings', unreal.TextureMipGenSettings.TMGS_NO_MIPMAPS)
texture.set_editor_property('srgb', True)
texture.set_editor_property('max_texture_size', 512)
if not unreal.EditorAssetLibrary.save_loaded_asset(texture):
raise RuntimeError('Texture save failed: ' + name)
data.set_editor_property('mIcon', texture)
if not unreal.EditorAssetLibrary.save_loaded_asset(data):
raise RuntimeError('Data asset save failed: ' + name)
report.append({'asset': data.get_path_name(), 'icon': texture.get_path_name()})
unreal.log('RELEASE_ICON_MAPPED ' + name)
report_path = Path(unreal.Paths.project_saved_dir()) / 'ReleaseIconBindings.json'
report_path.write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding='utf-8')
unreal.log('RELEASE_ICON_IMPORT_COMPLETE count=%d report=%s' % (len(report), report_path))
Loading