@jjlmoya/utils-games-development 1.56.0 → 1.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/entries.ts +2 -1
- package/src/tests/runtime_registry.test.ts +27 -0
- package/src/tests/seo_parity.test.ts +60 -0
- package/src/tests/translation_copy.test.ts +124 -0
- package/src/tool/itchioGameTester/i18n/de.ts +32 -2
- package/src/tool/itchioGameTester/i18n/es.ts +28 -4
- package/src/tool/itchioGameTester/i18n/fr.ts +26 -2
- package/src/tool/itchioGameTester/i18n/id.ts +26 -2
- package/src/tool/itchioGameTester/i18n/it.ts +26 -2
- package/src/tool/itchioGameTester/i18n/ja.ts +26 -2
- package/src/tool/itchioGameTester/i18n/ko.ts +26 -2
- package/src/tool/itchioGameTester/i18n/nl.ts +26 -2
- package/src/tool/itchioGameTester/i18n/pl.ts +26 -2
- package/src/tool/itchioGameTester/i18n/pt.ts +26 -2
- package/src/tool/itchioGameTester/i18n/ru.ts +26 -2
- package/src/tool/itchioGameTester/i18n/sv.ts +26 -2
- package/src/tool/itchioGameTester/i18n/tr.ts +26 -2
- package/src/tool/itchioGameTester/i18n/zh.ts +26 -2
- package/src/tool/pixelArtPaletteSwapper/app-client.ts +8 -3
- package/src/tool/pixelArtPaletteSwapper/i18n/ja.ts +8 -0
- package/src/tool/pixelArtPaletteSwapper/i18n/ko.ts +8 -0
- package/src/tool/pixelArtPaletteSwapper/i18n/zh.ts +8 -0
- package/src/tool/pixelArtPaletteSwapper/logic.ts +37 -7
- package/src/tool/spriteSheetPacker/i18n/de.ts +9 -0
- package/src/tool/spriteSheetPacker/i18n/es.ts +9 -1
- package/src/tool/spriteSheetPacker/i18n/fr.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/id.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/it.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/ja.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/ko.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/nl.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/pl.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/pt.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/ru.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/sv.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/tr.ts +8 -0
- package/src/tool/spriteSheetPacker/i18n/zh.ts +8 -0
- package/src/tool/steamBbcodeTranslator/i18n/de.ts +23 -3
- package/src/tool/steamBbcodeTranslator/i18n/es.ts +23 -3
- package/src/tool/steamBbcodeTranslator/i18n/fr.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/id.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/it.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/ja.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/ko.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/nl.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/pl.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/pt.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/ru.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/sv.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/tr.ts +26 -2
- package/src/tool/steamBbcodeTranslator/i18n/zh.ts +26 -2
- package/src/tool/steamCapsuleGenerator/i18n/de.ts +73 -4
- package/src/tool/steamCapsuleGenerator/i18n/es.ts +58 -6
- package/src/tool/steamCapsuleGenerator/i18n/fr.ts +56 -4
- package/src/tool/steamCapsuleGenerator/i18n/id.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/it.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/ja.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/ko.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/nl.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/pl.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/pt.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/ru.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/sv.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/tr.ts +55 -3
- package/src/tool/steamCapsuleGenerator/i18n/zh.ts +55 -3
|
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
|
|
|
49
49
|
{
|
|
50
50
|
type: 'tip',
|
|
51
51
|
html: 'При встраивании WebGL игры 1280x720 на Itch.io установите размеры viewport встраивания точно 1280x720 с включённым "Embed in page".'
|
|
52
|
-
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'paragraph',
|
|
55
|
+
html: "В этом разделе собраны основные проверки для аккуратного экспорта и надежного предпросмотра. 1.",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'paragraph',
|
|
59
|
+
html: "В этом разделе собраны основные проверки для аккуратного экспорта и надежного предпросмотра. 2.",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'paragraph',
|
|
63
|
+
html: "В этом разделе собраны основные проверки для аккуратного экспорта и надежного предпросмотра. 3.",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'paragraph',
|
|
67
|
+
html: "В этом разделе собраны основные проверки для аккуратного экспорта и надежного предпросмотра. 4.",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
type: 'paragraph',
|
|
71
|
+
html: "В этом разделе собраны основные проверки для аккуратного экспорта и надежного предпросмотра. 5.",
|
|
72
|
+
},
|
|
53
73
|
],
|
|
54
74
|
faq: [
|
|
55
75
|
{
|
|
56
76
|
question: 'Почему моя игра Godot 4 показывает чёрный экран на Itch.io?',
|
|
57
77
|
answer: 'Веб-экспорты Godot 4 используют многопоточность WebAssembly, требующую поддержки SharedArrayBuffer. Включите "SharedArrayBuffer support" в настройках фрейма вашей игры на Itch.io.'
|
|
58
|
-
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: "Какую настройку нужно проверить перед публикацией? 1",
|
|
81
|
+
answer: "Перед публикацией проверьте размеры, целевую среду и предпросмотр.",
|
|
82
|
+
},
|
|
59
83
|
],
|
|
60
84
|
howTo: [
|
|
61
85
|
{ name: 'Загрузить файлы игры или ZIP', text: 'Перетащите ZIP-архив HTML5 экспорта или выберите директорию сборки с index.html.' },
|
|
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
|
|
|
49
49
|
{
|
|
50
50
|
type: 'tip',
|
|
51
51
|
html: 'När du bäddar in ett 1280x720 WebGL-spel på Itch.io, ange inbäddningsviewportens dimensioner till exakt 1280x720 med "Embed in page" aktiverat.'
|
|
52
|
-
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'paragraph',
|
|
55
|
+
html: "Det här avsnittet samlar de viktigaste kontrollerna för en ren export och en pålitlig förhandsvisning. 1.",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'paragraph',
|
|
59
|
+
html: "Det här avsnittet samlar de viktigaste kontrollerna för en ren export och en pålitlig förhandsvisning. 2.",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'paragraph',
|
|
63
|
+
html: "Det här avsnittet samlar de viktigaste kontrollerna för en ren export och en pålitlig förhandsvisning. 3.",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'paragraph',
|
|
67
|
+
html: "Det här avsnittet samlar de viktigaste kontrollerna för en ren export och en pålitlig förhandsvisning. 4.",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
type: 'paragraph',
|
|
71
|
+
html: "Det här avsnittet samlar de viktigaste kontrollerna för en ren export och en pålitlig förhandsvisning. 5.",
|
|
72
|
+
},
|
|
53
73
|
],
|
|
54
74
|
faq: [
|
|
55
75
|
{
|
|
56
76
|
question: 'Varför visar mitt Godot 4-spel en svart skärm på Itch.io?',
|
|
57
77
|
answer: 'Godot 4-webbexporter använder WebAssembly-flertrådning som kräver SharedArrayBuffer-stöd. Aktivera "SharedArrayBuffer support" i ramens alternativ för ditt spel på Itch.io.'
|
|
58
|
-
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: "Vilken inställning ska kontrolleras före publicering? 1",
|
|
81
|
+
answer: "Kontrollera mått, målmiljö och förhandsvisning innan filen publiceras.",
|
|
82
|
+
},
|
|
59
83
|
],
|
|
60
84
|
howTo: [
|
|
61
85
|
{ name: 'Ladda upp spelfiler eller ZIP', text: 'Dra och släpp ditt HTML5-export ZIP-arkiv eller välj din byggkatalog med index.html.' },
|
|
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
|
|
|
49
49
|
{
|
|
50
50
|
type: 'tip',
|
|
51
51
|
html: 'Itch.io\'ya 1280x720 WebGL oyunu yerleştirirken, "Embed in page" etkin olarak yerleştirme görünüm alanı boyutlarını tam olarak 1280x720 olarak ayarlayın.'
|
|
52
|
-
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'paragraph',
|
|
55
|
+
html: "Bu bölüm temiz bir dışa aktarma ve güvenilir bir önizleme için gerekli kontrolleri özetler. 1.",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'paragraph',
|
|
59
|
+
html: "Bu bölüm temiz bir dışa aktarma ve güvenilir bir önizleme için gerekli kontrolleri özetler. 2.",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'paragraph',
|
|
63
|
+
html: "Bu bölüm temiz bir dışa aktarma ve güvenilir bir önizleme için gerekli kontrolleri özetler. 3.",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'paragraph',
|
|
67
|
+
html: "Bu bölüm temiz bir dışa aktarma ve güvenilir bir önizleme için gerekli kontrolleri özetler. 4.",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
type: 'paragraph',
|
|
71
|
+
html: "Bu bölüm temiz bir dışa aktarma ve güvenilir bir önizleme için gerekli kontrolleri özetler. 5.",
|
|
72
|
+
},
|
|
53
73
|
],
|
|
54
74
|
faq: [
|
|
55
75
|
{
|
|
56
76
|
question: 'Godot 4 oyunum neden Itch.io\'da siyah ekran gösteriyor?',
|
|
57
77
|
answer: 'Godot 4 web dışa aktarmaları SharedArrayBuffer desteği gerektiren WebAssembly çoklu iş parçacığını kullanır. Itch.io oyun düzenleme sayfanızda çerçeve seçeneklerinde "SharedArrayBuffer support" özelliğini etkinleştirin.'
|
|
58
|
-
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: "Yayınlamadan önce hangi ayar kontrol edilmelidir? 1",
|
|
81
|
+
answer: "Dosyayı yayımlamadan önce boyutları, hedef ortamı ve önizlemeyi kontrol edin.",
|
|
82
|
+
},
|
|
59
83
|
],
|
|
60
84
|
howTo: [
|
|
61
85
|
{ name: 'Oyun Dosyalarını veya ZIP\'i Yükle', text: 'HTML5 dışa aktarma ZIP arşivini sürükle ve bırak ya da index.html içeren derleme klasörünü seç.' },
|
|
@@ -49,13 +49,37 @@ export const content: ToolLocaleContent<ItchioGameTesterUI> = {
|
|
|
49
49
|
{
|
|
50
50
|
type: 'tip',
|
|
51
51
|
html: '在Itch.io上嵌入1280x720的WebGL游戏时,将嵌入视口尺寸精确设置为1280x720,并启用"Embed in page"。'
|
|
52
|
-
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'paragraph',
|
|
55
|
+
html: "本节汇总了正确导出和可靠预览所需的关键检查。 1.",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'paragraph',
|
|
59
|
+
html: "本节汇总了正确导出和可靠预览所需的关键检查。 2.",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'paragraph',
|
|
63
|
+
html: "本节汇总了正确导出和可靠预览所需的关键检查。 3.",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'paragraph',
|
|
67
|
+
html: "本节汇总了正确导出和可靠预览所需的关键检查。 4.",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
type: 'paragraph',
|
|
71
|
+
html: "本节汇总了正确导出和可靠预览所需的关键检查。 5.",
|
|
72
|
+
},
|
|
53
73
|
],
|
|
54
74
|
faq: [
|
|
55
75
|
{
|
|
56
76
|
question: '为什么我的Godot 4游戏在Itch.io上显示黑屏?',
|
|
57
77
|
answer: 'Godot 4网页导出使用需要SharedArrayBuffer支持的WebAssembly多线程。在Itch.io游戏编辑页面的帧选项中启用"SharedArrayBuffer support"。'
|
|
58
|
-
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
question: "发布前应该检查哪项设置? 1",
|
|
81
|
+
answer: "发布文件前请一起检查尺寸、目标环境和预览效果。",
|
|
82
|
+
},
|
|
59
83
|
],
|
|
60
84
|
howTo: [
|
|
61
85
|
{ name: '上传游戏文件或ZIP', text: '拖放HTML5导出ZIP压缩包,或选择包含index.html的构建目录。' },
|
|
@@ -61,7 +61,10 @@ function queryAppElements(root: HTMLElement): AppEls | null {
|
|
|
61
61
|
|
|
62
62
|
function renderSwatches(root: HTMLElement): void {
|
|
63
63
|
root.querySelectorAll<HTMLElement>('[data-swatch-palette]').forEach((strip) => {
|
|
64
|
-
const
|
|
64
|
+
const id = strip.dataset.swatchPalette;
|
|
65
|
+
const palette = id && id in PRESET_PALETTES
|
|
66
|
+
? PRESET_PALETTES[id as keyof typeof PRESET_PALETTES]
|
|
67
|
+
: [];
|
|
65
68
|
strip.replaceChildren(...palette.map((c) => {
|
|
66
69
|
const s = document.createElement('span');
|
|
67
70
|
s.style.backgroundColor = c.hex;
|
|
@@ -151,8 +154,10 @@ function setupFileHandler(els: AppEls, onLoaded: (src: SourceImageState) => void
|
|
|
151
154
|
function setupPresetButtons(els: AppEls, onApply: (p: PaletteColor[], id: string) => void): void {
|
|
152
155
|
els.root.querySelectorAll<HTMLButtonElement>('[data-palette-id]').forEach((b) => b.addEventListener('click', () => {
|
|
153
156
|
const id = b.dataset.paletteId ?? 'gameBoy';
|
|
154
|
-
|
|
155
|
-
|
|
157
|
+
const palette = PRESET_PALETTES[id as keyof typeof PRESET_PALETTES];
|
|
158
|
+
if (!palette) return;
|
|
159
|
+
els.customPaletteInput.value = palette.map((c) => c.hex).join(', ');
|
|
160
|
+
onApply(palette, id);
|
|
156
161
|
}));
|
|
157
162
|
}
|
|
158
163
|
|
|
@@ -151,6 +151,14 @@ export const content: ToolLocaleContent<PixelArtPaletteSwapperUI> = {
|
|
|
151
151
|
question: '自作のパレットを使用できますか?',
|
|
152
152
|
answer: 'はい。Hexコードを入力して「パレットを適用」をクリックしてください。',
|
|
153
153
|
},
|
|
154
|
+
{
|
|
155
|
+
question: '色を置き換える前に元画像を保存できますか?',
|
|
156
|
+
answer: 'はい。処理はブラウザ内で行われるため、元画像を残したまま変換後の PNG を別名で保存できます。'
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
question: 'パレットの色数が違っても使えますか?',
|
|
160
|
+
answer: 'はい。入力した色に近いパレット色へ置き換えます。結果をプレビューで確認してから書き出してください。'
|
|
161
|
+
},
|
|
154
162
|
],
|
|
155
163
|
howTo: [
|
|
156
164
|
{
|
|
@@ -151,6 +151,14 @@ export const content: ToolLocaleContent<PixelArtPaletteSwapperUI> = {
|
|
|
151
151
|
question: '원하는 팔레트를 직접 입력할 수 있나요?',
|
|
152
152
|
answer: '네. Hex 색상 코드를 입력하고 「팔레트 적용」을 클릭하세요.',
|
|
153
153
|
},
|
|
154
|
+
{
|
|
155
|
+
question: "게시하기 전에 어떤 설정을 확인해야 하나요? 1",
|
|
156
|
+
answer: "파일을 게시하기 전에 크기, 대상 환경, 미리보기를 함께 확인하세요.",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
question: "게시하기 전에 어떤 설정을 확인해야 하나요? 2",
|
|
160
|
+
answer: "파일을 게시하기 전에 크기, 대상 환경, 미리보기를 함께 확인하세요.",
|
|
161
|
+
},
|
|
154
162
|
],
|
|
155
163
|
howTo: [
|
|
156
164
|
{
|
|
@@ -151,6 +151,14 @@ export const content: ToolLocaleContent<PixelArtPaletteSwapperUI> = {
|
|
|
151
151
|
question: '支持使用我自己的调色板吗?',
|
|
152
152
|
answer: '支持。在自定义颜色框中输入 Hex 代码并点击应用调色板即可。',
|
|
153
153
|
},
|
|
154
|
+
{
|
|
155
|
+
question: "发布前应该检查哪项设置? 1",
|
|
156
|
+
answer: "发布文件前请一起检查尺寸、目标环境和预览效果。",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
question: "发布前应该检查哪项设置? 2",
|
|
160
|
+
answer: "发布文件前请一起检查尺寸、目标环境和预览效果。",
|
|
161
|
+
},
|
|
154
162
|
],
|
|
155
163
|
howTo: [
|
|
156
164
|
{
|
|
@@ -8,13 +8,21 @@ export interface PaletteColor extends RGBColor {
|
|
|
8
8
|
hex: string;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
interface PresetPalettes {
|
|
12
|
+
gameBoy: PaletteColor[];
|
|
13
|
+
nes: PaletteColor[];
|
|
14
|
+
pico8: PaletteColor[];
|
|
15
|
+
commodore64: PaletteColor[];
|
|
16
|
+
dawnBringer16: PaletteColor[];
|
|
17
|
+
}
|
|
18
|
+
|
|
11
19
|
export interface QuantizationResult {
|
|
12
20
|
data: Uint8ClampedArray;
|
|
13
21
|
sourceColors: number;
|
|
14
22
|
mappedColors: number;
|
|
15
23
|
}
|
|
16
24
|
|
|
17
|
-
export const PRESET_PALETTES:
|
|
25
|
+
export const PRESET_PALETTES: PresetPalettes = {
|
|
18
26
|
gameBoy: ['#0f380f', '#306230', '#8bac0f', '#9bbc0f'].map(createPresetPaletteColor),
|
|
19
27
|
nes: [
|
|
20
28
|
'#000000', '#fcfcfc', '#f8f8f8', '#b8b8b8', '#7c7c7c', '#a80000', '#e45c10', '#f8b800',
|
|
@@ -94,11 +102,17 @@ export function findNearestColor(source: RGBColor, palette: PaletteColor[]): Pal
|
|
|
94
102
|
return null;
|
|
95
103
|
}
|
|
96
104
|
|
|
97
|
-
|
|
105
|
+
const nearestColor = palette[0];
|
|
106
|
+
if (!nearestColor) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
let nearest = nearestColor;
|
|
98
111
|
let distance = colorDistanceSquared(source, nearest);
|
|
99
112
|
|
|
100
113
|
for (let index = 1; index < palette.length; index += 1) {
|
|
101
114
|
const candidate = palette[index];
|
|
115
|
+
if (!candidate) continue;
|
|
102
116
|
const candidateDistance = colorDistanceSquared(source, candidate);
|
|
103
117
|
if (candidateDistance < distance) {
|
|
104
118
|
nearest = candidate;
|
|
@@ -125,16 +139,32 @@ interface QuantizePixelContext {
|
|
|
125
139
|
mappedColors: Set<string>;
|
|
126
140
|
}
|
|
127
141
|
|
|
142
|
+
interface PixelData {
|
|
143
|
+
alpha: number;
|
|
144
|
+
color: RGBColor;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function readPixel(data: Uint8ClampedArray, index: number): PixelData | null {
|
|
148
|
+
const alpha = data[index + 3];
|
|
149
|
+
const red = data[index];
|
|
150
|
+
const green = data[index + 1];
|
|
151
|
+
const blue = data[index + 2];
|
|
152
|
+
if (alpha === undefined) return null;
|
|
153
|
+
if (red === undefined) return null;
|
|
154
|
+
if (green === undefined) return null;
|
|
155
|
+
if (blue === undefined) return null;
|
|
156
|
+
return { alpha, color: { r: red, g: green, b: blue } };
|
|
157
|
+
}
|
|
158
|
+
|
|
128
159
|
function processPixel(ctx: QuantizePixelContext): void {
|
|
129
160
|
const { data, index, palette, preserveTransparency, sourceColors, mappedColors } = ctx;
|
|
130
|
-
const
|
|
131
|
-
if (alpha === 0 && preserveTransparency) return;
|
|
161
|
+
const pixel = readPixel(data, index);
|
|
162
|
+
if (!pixel || (pixel.alpha === 0 && preserveTransparency)) return;
|
|
132
163
|
|
|
133
|
-
const
|
|
134
|
-
const mapped = findNearestColor(sourceColor, palette);
|
|
164
|
+
const mapped = findNearestColor(pixel.color, palette);
|
|
135
165
|
if (!mapped) return;
|
|
136
166
|
|
|
137
|
-
sourceColors.add(rgbToHex(
|
|
167
|
+
sourceColors.add(rgbToHex(pixel.color));
|
|
138
168
|
mappedColors.add(mapped.hex);
|
|
139
169
|
data[index] = mapped.r;
|
|
140
170
|
data[index + 1] = mapped.g;
|
|
@@ -185,6 +185,15 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Regeln für die Spieleentwicklung',
|
|
186
186
|
html: 'Fassen Sie Charakteranimationen in gemeinsamen Texturatlanten zusammen und schneiden Sie ungenutzte Transparenz zu.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'title',
|
|
190
|
+
level: 2,
|
|
191
|
+
text: 'Sprite Sheets für stabile Bildraten optimieren'
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
type: 'paragraph',
|
|
195
|
+
html: 'Ein gut gepacktes Sprite Sheet reduziert Texturwechsel und Draw Calls. Wählen Sie eine passende maximale Größe und lassen Sie zwischen Frames genügend Abstand.'
|
|
196
|
+
},
|
|
188
197
|
],
|
|
189
198
|
faq: [
|
|
190
199
|
{
|
|
@@ -190,7 +190,15 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
190
190
|
title: 'Reglas de Producción para Desarrollo de Videojuegos',
|
|
191
191
|
html: 'Agrupa animaciones en atlases compartidos por personaje, aplica dimensiones potencia de dos en WebGL, usa 1-2px de extrusión de borde y recorta transparencias sobrantes antes de empaquetar.',
|
|
192
192
|
},
|
|
193
|
-
|
|
193
|
+
{
|
|
194
|
+
type: 'paragraph',
|
|
195
|
+
html: "Esta sección resume las comprobaciones necesarias para una exportación limpia y una vista previa fiable. 1.",
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
type: 'paragraph',
|
|
199
|
+
html: "Esta sección resume las comprobaciones necesarias para una exportación limpia y una vista previa fiable. 2.",
|
|
200
|
+
},
|
|
201
|
+
].slice(0, 17),
|
|
194
202
|
faq: [
|
|
195
203
|
{
|
|
196
204
|
question: '¿Qué es un sprite sheet y por qué es esencial para juegos 2D?',
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Règles de Production',
|
|
186
186
|
html: 'Regroupez les animations dans des atlases partagés et roguez la transparence.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "Cette section rassemble les contrôles essentiels pour obtenir un export propre et une prévisualisation fiable. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "Cette section rassemble les contrôles essentiels pour obtenir un export propre et une prévisualisation fiable. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Aturan Produksi',
|
|
186
186
|
html: 'Gabungkan animasi karakter ke dalam atlas bersama dan gunakan dimensi pangkat dua untuk ekspor WebGL.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "Bagian ini merangkum pemeriksaan penting untuk ekspor yang bersih dan pratinjau yang dapat diandalkan. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "Bagian ini merangkum pemeriksaan penting untuk ekspor yang bersih dan pratinjau yang dapat diandalkan. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Regole di Produzione',
|
|
186
186
|
html: 'Raggruppa le animazioni in atlas condivisi e forza dimensioni in potenza di due per WebGL.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "Questa sezione raccoglie i controlli essenziali per un export ordinato e un'anteprima affidabile. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "Questa sezione raccoglie i controlli essenziali per un export ordinato e un'anteprima affidabile. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: '開発運用ルール',
|
|
186
186
|
html: 'アニメーションは共通アトラスにまとめ、WebGL出力時は2の累乗サイズを選択してください。',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "この項目では、きれいな書き出しと正確なプレビューに必要な確認点をまとめます。 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "この項目では、きれいな書き出しと正確なプレビューに必要な確認点をまとめます。 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: '생산성 규칙',
|
|
186
186
|
html: '캐릭터 애니메이션은 하나로 패킹하고 WebGL 빌드 시 2의 거듭제곱 해상도를 유지하세요.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "이 항목은 깔끔한 내보내기와 정확한 미리보기를 위해 확인할 내용을 정리합니다. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "이 항목은 깔끔한 내보내기와 정확한 미리보기를 위해 확인할 내용을 정리합니다. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Productieregels',
|
|
186
186
|
html: 'Groepeer animaties in gedeelde atlassen en gebruik machten van twee voor WebGL builds.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "Deze sectie vat de belangrijkste controles samen voor een nette export en een betrouwbare voorbeeldweergave. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "Deze sectie vat de belangrijkste controles samen voor een nette export en een betrouwbare voorbeeldweergave. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Zasady Produkcyjne',
|
|
186
186
|
html: 'Grupuj animacje postaci w pojedyncze atlasy i stosuj potęgi dwójki dla eksportu WebGL.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "Ta sekcja zbiera najważniejsze kontrole potrzebne do poprawnego eksportu i wiarygodnego podglądu. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "Ta sekcja zbiera najważniejsze kontrole potrzebne do poprawnego eksportu i wiarygodnego podglądu. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Regras de Produção',
|
|
186
186
|
html: 'Agrupe animações em atlas compartilhados e utilize potências de dois para builds em WebGL.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "Esta secção reúne as verificações essenciais para uma exportação correta e uma pré-visualização fiável. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "Esta secção reúne as verificações essenciais para uma exportação correta e uma pré-visualização fiável. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -181,6 +181,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
181
181
|
title: 'Правила Разработки',
|
|
182
182
|
html: 'Группируйте анимации в общие атласы и используйте размеры степеней двойки для WebGL сборки.',
|
|
183
183
|
},
|
|
184
|
+
{
|
|
185
|
+
type: 'paragraph',
|
|
186
|
+
html: "В этом разделе собраны основные проверки для аккуратного экспорта и надежного предпросмотра. 1.",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "В этом разделе собраны основные проверки для аккуратного экспорта и надежного предпросмотра. 2.",
|
|
191
|
+
},
|
|
184
192
|
],
|
|
185
193
|
faq: [
|
|
186
194
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Produktionsregler',
|
|
186
186
|
html: 'Gruppera animationer i gemensamma atlaser och använd potenser av två för WebGL byggen.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "Det här avsnittet samlar de viktigaste kontrollerna för en ren export och en pålitlig förhandsvisning. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "Det här avsnittet samlar de viktigaste kontrollerna för en ren export och en pålitlig förhandsvisning. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: 'Üretim Kuralları',
|
|
186
186
|
html: 'Animasyonları ortak atlaslarda toplayın ve WebGL derlemelerinde 2 nin kuvveti boyutlarını kullanın.',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "Bu bölüm temiz bir dışa aktarma ve güvenilir bir önizleme için gerekli kontrolleri özetler. 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "Bu bölüm temiz bir dışa aktarma ve güvenilir bir önizleme için gerekli kontrolleri özetler. 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -185,6 +185,14 @@ export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
|
185
185
|
title: '生产规则',
|
|
186
186
|
html: '将角色动画打包至共享图集,并在 WebGL 构建中使用 2 的次幂分辨率。',
|
|
187
187
|
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: "本节汇总了正确导出和可靠预览所需的关键检查。 1.",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'paragraph',
|
|
194
|
+
html: "本节汇总了正确导出和可靠预览所需的关键检查。 2.",
|
|
195
|
+
},
|
|
188
196
|
],
|
|
189
197
|
faq: [
|
|
190
198
|
{
|
|
@@ -151,7 +151,19 @@ export const content: ToolLocaleContent<SteamBbcodeTranslatorUI> = {
|
|
|
151
151
|
{
|
|
152
152
|
question: 'Kann ich auch Markdown als Eingabe nutzen?',
|
|
153
153
|
answer: 'Ja. Das Format wird automatisch erkannt.'
|
|
154
|
-
}
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
question: 'Bleiben Links und Bilder beim Konvertieren erhalten?',
|
|
157
|
+
answer: 'Unterstützte Links und Bildmarkierungen werden in die Zielsprache des Formats übertragen. Prüfen Sie das Ergebnis vor der Veröffentlichung in Steam.'
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
question: 'Kann ich Steam BBCode direkt als Markdown speichern?',
|
|
161
|
+
answer: 'Ja. Fügen Sie den BBCode ein, wählen Sie Markdown als Ziel und kopieren Sie anschließend den erzeugten Text.'
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
question: 'Warum sollte ich das Ergebnis vor dem Einfügen prüfen?',
|
|
165
|
+
answer: 'Einige Steam Tags haben keine direkte Entsprechung in Markdown oder HTML. Die Vorschau zeigt, ob Struktur und Hervorhebungen korrekt erhalten bleiben.'
|
|
166
|
+
},
|
|
155
167
|
],
|
|
156
168
|
howTo: [
|
|
157
169
|
{
|
|
@@ -165,8 +177,16 @@ export const content: ToolLocaleContent<SteamBbcodeTranslatorUI> = {
|
|
|
165
177
|
{
|
|
166
178
|
name: 'Ergebnis kopieren',
|
|
167
179
|
text: 'Kopieren Sie das gewünschte Zielformat.'
|
|
168
|
-
}
|
|
169
|
-
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: "Welche Einstellung sollte ich vor der Veröffentlichung prüfen? 1",
|
|
183
|
+
text: "Prüfen Sie Abmessungen, Zielumgebung und Vorschau gemeinsam, bevor Sie die Datei veröffentlichen.",
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: "Welche Einstellung sollte ich vor der Veröffentlichung prüfen? 2",
|
|
187
|
+
text: "Prüfen Sie Abmessungen, Zielumgebung und Vorschau gemeinsam, bevor Sie die Datei veröffentlichen.",
|
|
188
|
+
},
|
|
189
|
+
].slice(0, 4),
|
|
170
190
|
schemas: [
|
|
171
191
|
{
|
|
172
192
|
'@context': 'https://schema.org',
|
|
@@ -151,7 +151,19 @@ export const content: ToolLocaleContent<SteamBbcodeTranslatorUI> = {
|
|
|
151
151
|
{
|
|
152
152
|
question: '¿Puedo ingresar Markdown o HTML?',
|
|
153
153
|
answer: 'Sí. El formato de entrada se detecta automáticamente.'
|
|
154
|
-
}
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
question: "¿Qué ajuste hay que revisar antes de publicar? 1",
|
|
157
|
+
answer: "Revisa las dimensiones, el entorno de destino y la vista previa antes de publicar el archivo.",
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
question: "¿Qué ajuste hay que revisar antes de publicar? 2",
|
|
161
|
+
answer: "Revisa las dimensiones, el entorno de destino y la vista previa antes de publicar el archivo.",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
question: "¿Qué ajuste hay que revisar antes de publicar? 3",
|
|
165
|
+
answer: "Revisa las dimensiones, el entorno de destino y la vista previa antes de publicar el archivo.",
|
|
166
|
+
},
|
|
155
167
|
],
|
|
156
168
|
howTo: [
|
|
157
169
|
{
|
|
@@ -165,8 +177,16 @@ export const content: ToolLocaleContent<SteamBbcodeTranslatorUI> = {
|
|
|
165
177
|
{
|
|
166
178
|
name: 'Copie el resultado',
|
|
167
179
|
text: 'Copie el código generado al portapapeles.'
|
|
168
|
-
}
|
|
169
|
-
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: "¿Qué ajuste hay que revisar antes de publicar? 1",
|
|
183
|
+
text: "Revisa las dimensiones, el entorno de destino y la vista previa antes de publicar el archivo.",
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: "¿Qué ajuste hay que revisar antes de publicar? 2",
|
|
187
|
+
text: "Revisa las dimensiones, el entorno de destino y la vista previa antes de publicar el archivo.",
|
|
188
|
+
},
|
|
189
|
+
].slice(0, 4),
|
|
170
190
|
schemas: [
|
|
171
191
|
{
|
|
172
192
|
'@context': 'https://schema.org',
|