@jjlmoya/utils-games-development 1.51.0 → 1.52.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.
Files changed (31) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/tests/locale_completeness.test.ts +2 -2
  5. package/src/tests/tool_validation.test.ts +2 -2
  6. package/src/tool/saveFileEditor/bibliography.astro +6 -0
  7. package/src/tool/saveFileEditor/bibliography.ts +12 -0
  8. package/src/tool/saveFileEditor/component.astro +351 -0
  9. package/src/tool/saveFileEditor/entry.ts +28 -0
  10. package/src/tool/saveFileEditor/game-save-file-editor.css +250 -0
  11. package/src/tool/saveFileEditor/i18n/de.ts +182 -0
  12. package/src/tool/saveFileEditor/i18n/en.ts +182 -0
  13. package/src/tool/saveFileEditor/i18n/es.ts +182 -0
  14. package/src/tool/saveFileEditor/i18n/fr.ts +182 -0
  15. package/src/tool/saveFileEditor/i18n/id.ts +182 -0
  16. package/src/tool/saveFileEditor/i18n/it.ts +182 -0
  17. package/src/tool/saveFileEditor/i18n/ja.ts +182 -0
  18. package/src/tool/saveFileEditor/i18n/ko.ts +182 -0
  19. package/src/tool/saveFileEditor/i18n/nl.ts +182 -0
  20. package/src/tool/saveFileEditor/i18n/pl.ts +182 -0
  21. package/src/tool/saveFileEditor/i18n/pt.ts +182 -0
  22. package/src/tool/saveFileEditor/i18n/ru.ts +182 -0
  23. package/src/tool/saveFileEditor/i18n/sv.ts +182 -0
  24. package/src/tool/saveFileEditor/i18n/tr.ts +182 -0
  25. package/src/tool/saveFileEditor/i18n/zh.ts +182 -0
  26. package/src/tool/saveFileEditor/index.ts +11 -0
  27. package/src/tool/saveFileEditor/logic.test.ts +69 -0
  28. package/src/tool/saveFileEditor/logic.ts +139 -0
  29. package/src/tool/saveFileEditor/seo.astro +15 -0
  30. package/src/tool/saveFileEditor/ui.ts +24 -0
  31. package/src/tools.ts +2 -0
@@ -0,0 +1,250 @@
1
+ .save-editor-main-card {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 1.5rem;
5
+ padding: 1.5rem;
6
+ border-radius: 1rem;
7
+ background: var(--bg-surface, #fff);
8
+ border: 1px solid var(--border-base, #e2e8f0);
9
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05);
10
+ color: var(--text-base, #0f172a);
11
+ transition: background-color 0.2s, border-color 0.2s;
12
+ }
13
+
14
+ .theme-dark .save-editor-main-card,
15
+ :global(.theme-dark) .save-editor-main-card {
16
+ background: var(--bg-surface, #0f172a);
17
+ border-color: var(--border-base, #1e293b);
18
+ color: var(--text-base, #f8fafc);
19
+ }
20
+
21
+ .editor-unified-layout {
22
+ display: grid;
23
+ grid-template-columns: 1fr;
24
+ gap: 1.5rem;
25
+ }
26
+
27
+ @media (min-width: 900px) {
28
+ .editor-unified-layout {
29
+ grid-template-columns: 1fr 1fr;
30
+ }
31
+ }
32
+
33
+ .control-panel {
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: 1rem;
37
+ }
38
+
39
+ .dropzone {
40
+ border: 2px dashed var(--border-base, #cbd5e1);
41
+ border-radius: 0.75rem;
42
+ padding: 2rem 1rem;
43
+ text-align: center;
44
+ background: rgba(59, 130, 246, 0.03);
45
+ cursor: pointer;
46
+ transition: background-color 0.2s;
47
+ }
48
+
49
+ .theme-dark .dropzone,
50
+ :global(.theme-dark) .dropzone {
51
+ border-color: var(--border-base, #334155);
52
+ background: rgba(30, 41, 59, 0.3);
53
+ }
54
+
55
+ .dropzone:hover {
56
+ background: rgba(59, 130, 246, 0.08);
57
+ }
58
+
59
+ .panel-section-title {
60
+ font-size: 1rem;
61
+ font-weight: 700;
62
+ margin: 0 0 0.25rem;
63
+ color: var(--text-base, #0f172a);
64
+ opacity: 0.9;
65
+ }
66
+
67
+ .theme-dark .panel-section-title,
68
+ :global(.theme-dark) .panel-section-title {
69
+ color: var(--text-base, #f8fafc);
70
+ }
71
+
72
+ .options-row {
73
+ display: grid;
74
+ grid-template-columns: 1fr;
75
+ gap: 0.75rem;
76
+ }
77
+
78
+ @media (min-width: 500px) {
79
+ .options-row {
80
+ grid-template-columns: 1fr 1fr;
81
+ }
82
+ }
83
+
84
+ .form-group {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 0.35rem;
88
+ }
89
+
90
+ .form-label {
91
+ font-size: 0.8125rem;
92
+ font-weight: 600;
93
+ }
94
+
95
+ .input-select, .input-text, .textarea-code {
96
+ width: 100%;
97
+ padding: 0.6rem 0.8rem;
98
+ border-radius: 0.5rem;
99
+ border: 1px solid var(--border-base, #cbd5e1);
100
+ background: var(--bg-surface, #fff);
101
+ color: var(--text-base, #0f172a);
102
+ font-size: 0.875rem;
103
+ }
104
+
105
+ .method-chip-group {
106
+ display: flex;
107
+ gap: 0.35rem;
108
+ background: var(--bg-surface, #fff);
109
+ padding: 0.25rem;
110
+ border-radius: 0.5rem;
111
+ border: 1px solid var(--border-base, #cbd5e1);
112
+ }
113
+
114
+ .theme-dark .method-chip-group,
115
+ :global(.theme-dark) .method-chip-group {
116
+ background: var(--bg-surface, #0f172a);
117
+ border-color: var(--border-base, #334155);
118
+ }
119
+
120
+ .chip-btn {
121
+ flex: 1;
122
+ padding: 0.45rem 0.5rem;
123
+ border-radius: 0.375rem;
124
+ border: none;
125
+ background: transparent;
126
+ color: var(--text-base, #64748b);
127
+ font-size: 0.75rem;
128
+ font-weight: 600;
129
+ cursor: pointer;
130
+ transition: all 0.15s ease;
131
+ text-align: center;
132
+ white-space: nowrap;
133
+ }
134
+
135
+ .theme-dark .chip-btn,
136
+ :global(.theme-dark) .chip-btn {
137
+ color: var(--text-base, #94a3b8);
138
+ }
139
+
140
+ .chip-btn.active {
141
+ background: var(--accent-base, #3b82f6);
142
+ color: var(--text-inverse, #fff);
143
+ box-shadow: 0 2px 6px rgba(59, 130, 246, 0.3);
144
+ }
145
+
146
+ .chip-btn:hover:not(.active) {
147
+ background: rgba(59, 130, 246, 0.08);
148
+ color: var(--accent-base, #3b82f6);
149
+ }
150
+
151
+ .textarea-code {
152
+ min-height: 250px;
153
+ resize: vertical;
154
+ }
155
+
156
+ .btn-primary {
157
+ padding: 0.75rem 1.25rem;
158
+ border-radius: 0.5rem;
159
+ border: none;
160
+ background: var(--accent-base, #3b82f6);
161
+ color: var(--text-inverse, #fff);
162
+ font-weight: 700;
163
+ cursor: pointer;
164
+ transition: all 0.2s;
165
+ }
166
+
167
+ .btn-primary:hover {
168
+ background: var(--accent-base, #2563eb);
169
+ }
170
+
171
+ .btn-secondary {
172
+ padding: 0.5rem 1rem;
173
+ border-radius: 0.5rem;
174
+ border: 1px solid var(--border-base, #cbd5e1);
175
+ background: transparent;
176
+ color: inherit;
177
+ font-weight: 600;
178
+ font-size: 0.875rem;
179
+ cursor: pointer;
180
+ }
181
+
182
+ .theme-dark .btn-secondary,
183
+ :global(.theme-dark) .btn-secondary {
184
+ border-color: var(--border-base, #334155);
185
+ color: var(--text-base, #e2e8f0);
186
+ }
187
+
188
+ .error-banner {
189
+ padding: 0.75rem 1rem;
190
+ border-radius: 0.5rem;
191
+ background: rgba(239, 68, 68, 0.1);
192
+ border: 1px solid rgba(239, 68, 68, 0.3);
193
+ color: var(--text-danger, #ef4444);
194
+ font-size: 0.875rem;
195
+ }
196
+
197
+ .stats-grid {
198
+ display: grid;
199
+ grid-template-columns: repeat(3, 1fr);
200
+ gap: 0.75rem;
201
+ padding: 1rem;
202
+ border-radius: 0.75rem;
203
+ background: rgba(0, 0, 0, 0.02);
204
+ }
205
+
206
+ .theme-dark .stats-grid,
207
+ :global(.theme-dark) .stats-grid {
208
+ background: rgba(255, 255, 255, 0.02);
209
+ }
210
+
211
+ .stat-item {
212
+ display: flex;
213
+ flex-direction: column;
214
+ align-items: center;
215
+ text-align: center;
216
+ }
217
+
218
+ .stat-val {
219
+ font-size: 1.125rem;
220
+ font-weight: 800;
221
+ color: var(--accent-base, #3b82f6);
222
+ }
223
+
224
+ .stat-lbl {
225
+ font-size: 0.75rem;
226
+ opacity: 0.7;
227
+ }
228
+
229
+ .copied-notice {
230
+ color: var(--accent-base, #10b981);
231
+ font-size: 0.875rem;
232
+ }
233
+
234
+ .tree-view-container {
235
+ display: flex;
236
+ flex-direction: column;
237
+ gap: 1rem;
238
+ }
239
+
240
+ .tree-toolbar {
241
+ display: flex;
242
+ gap: 0.5rem;
243
+ flex-wrap: wrap;
244
+ }
245
+
246
+ .tree-node {
247
+ margin-left: 1rem;
248
+ padding-left: 0.5rem;
249
+ border-left: 1px dashed var(--border-subtle, #cbd5e1);
250
+ }
@@ -0,0 +1,182 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { SaveFileEditorUI } from '../ui';
3
+ import { bibliographyEntries } from '../bibliography';
4
+
5
+ export const content: ToolLocaleContent<SaveFileEditorUI> = {
6
+ slug: 'spiel-speicherstand-editor',
7
+ title: 'Spiel Speicherstand Editor und Obfuskator',
8
+ description: 'Entschlüsseln, überprüfen, bearbeiten Sie JSON Payloads und verschlüsseln Sie Spiel Speicherstände lokal mit Base64, XOR Maskierung oder Klartext.',
9
+ ui: {
10
+ title: 'Spiel Speicherstand Editor & Obfuskator',
11
+ subtitle: 'Lokale Speicherstände sicher prüfen, bearbeiten und verschlüsseln ohne Serverübertragung',
12
+ dropSaveFile: 'Ziehen Sie die Speicherdatei hierher oder klicken Sie',
13
+ orSelectFile: 'oder klicken Sie, um eine lokale Datei auszuwählen',
14
+ encryptionMethod: 'Verschlüsselungsformat',
15
+ methodBase64: 'Base64 Kodierung',
16
+ methodXor: 'XOR Maske + Base64',
17
+ methodRaw: 'Unverschlüsseltes JSON',
18
+ xorKeyLabel: 'Geheimer XOR Schlüssel',
19
+ xorKeyPlaceholder: 'z.B. MeinGeheimerSchluessel2026',
20
+ jsonRawTitle: 'Entschlüsseltes JSON Payload (Live Editor)',
21
+ encodeAndDownload: 'Verschlüsseln & Datei Herunterladen',
22
+ copyEncoded: 'Verschlüsselten Text Kopieren',
23
+ copiedNotice: 'In die Zwischenablage kopiert!',
24
+ decodedKeysCount: 'Gesamte Parameter',
25
+ dataSize: 'Payload Größe',
26
+ detectedFormat: 'Erkanntes Format',
27
+ exportPreviewLabel: 'Vorschau der Verschlüsselten Ausgabe',
28
+ decodePanelTitle: 'Entschlüsselung und Live JSON Editor',
29
+ exportPanelTitle: 'Neu Verschlüsselte Ausgabe',
30
+ decodeError: 'Fehler beim Entschlüsseln der Speicherdatei',
31
+ bytesUnit: 'B',
32
+ },
33
+ seo: [
34
+ {
35
+ type: 'title',
36
+ level: 2,
37
+ text: 'Sicherheit und Obfuskationsprotokolle für Spielspeicherstände',
38
+ },
39
+ {
40
+ type: 'paragraph',
41
+ html: 'Videospiele serialisieren den Fortschritt des Spielers in persistenten Speicherformaten, um Inventarbestände, freigeschaltete Level und Spielerattribute über Spielsitzungen hinweg zu bewahren. Um einfaches Ändern im Texteditor durch Endnutzer zu verhindern, obfuszieren Entwickler Speicherstände mit Kodierungsschemata wie Base64 oder XOR Bitmaskierung mit einem geheimen Schlüssel. Während der Qualitätssicherung und des Live Operations Debuggings benötigen Entwicklungsteams sofortigen Zugriff auf rohe JSON Strukturen, um Grenzwerttests durchzuführen und modifizierte Daten ohne erneutes Kompilieren von Spielbinärdateien bereitzustellen.',
42
+ },
43
+ {
44
+ type: 'stats',
45
+ columns: 4,
46
+ items: [
47
+ { label: 'Client Verarbeitung', value: '100% Lokal' },
48
+ { label: 'Unterstützte Dekoder', value: 'Base64 / XOR / JSON' },
49
+ { label: 'Dekodierungslatenz', value: '0 ms' },
50
+ { label: 'Datenverlust Risiko', value: 'Null' },
51
+ ],
52
+ },
53
+ {
54
+ type: 'title',
55
+ level: 2,
56
+ text: 'Vergleich der Obfuskationsverfahren',
57
+ },
58
+ {
59
+ type: 'comparative',
60
+ columns: 3,
61
+ items: [
62
+ {
63
+ title: 'Base64 Kodierung',
64
+ description: 'Schnelle Zeichenkonvertierung gegen einfaches Bearbeiten im Texteditor ohne kryptografische Sicherheit.',
65
+ },
66
+ {
67
+ title: 'XOR Maskierung + Base64',
68
+ description: 'Standard in der Indie Spieleentwicklung. Mischt String Bytes mit einem Schlüssel gegen Cheat Engines.',
69
+ },
70
+ {
71
+ title: 'Unverschlüsseltes JSON',
72
+ description: 'Lesbarer Speicherstand für Prototypen und interne Team Iterationen.',
73
+ },
74
+ ],
75
+ },
76
+ {
77
+ type: 'title',
78
+ level: 2,
79
+ text: 'QS Testpraxis für Speicherstandsüberprüfung',
80
+ },
81
+ {
82
+ type: 'tip',
83
+ title: 'Best Practices für Speicherstandssicherheit in der QS',
84
+ html: 'Verwenden Sie getrennte Debug Schlüssel für interne Builds. Nutzen Sie lokale Inspektoren zur Überprüfung von Grenzwerten ohne Neukompilierung des Spielcodes.',
85
+ },
86
+ {
87
+ type: 'title',
88
+ level: 2,
89
+ text: 'Richtlinien für Spielzustandsparameter',
90
+ },
91
+ {
92
+ type: 'table',
93
+ headers: ['Datentyp', 'Empfohlenes Format', 'Typischer Anwendungsfall', 'Obfuskationsschicht'],
94
+ rows: [
95
+ ['Numerische Zahlen', '32-Bit-Integer', 'Münzen, Level, XP, Munition', 'XOR-maskiert'],
96
+ ['Booleche Flags', 'Standard-Boolean', 'Tutorial Abgeschlossen', 'Base64 / XOR'],
97
+ ['Verschachtelte Objekte', 'JSON-Hierarchie', 'Inventar, Fähigkeiten', 'Base64-kodiert'],
98
+ ['Zeitstempel', 'ISO 8601 UTC', 'Tägliches Login', 'XOR-maskiert'],
99
+ ],
100
+ },
101
+ {
102
+ type: 'title',
103
+ level: 2,
104
+ text: 'Reverse Engineering und Anti Tamper Überlegungen',
105
+ },
106
+ {
107
+ type: 'paragraph',
108
+ html: 'Obfuskation auf Client Seite verhindert einfaches Ändern durch Gelegenheitsspieler, jedoch sind XOR und Base64 keine echten kryptografischen Algorithmen. Werkzeuge zur Speicheranalyse wie RenderDoc oder x64dbg können Schlüsselgenerierungsroutinen direkt in kompilierten C++ oder C# Baugruppen untersuchen. Für kompetitive Titel sind serverseitige Validierungen oder kryptografische HMAC Signaturen unerlässlich.',
109
+ },
110
+ ],
111
+ faqTitle: 'Häufig Gestellte Fragen',
112
+ faq: [
113
+ {
114
+ question: 'Werden meine Speicherdaten auf einen Server hochgeladen?',
115
+ answer: 'Nein. Alle Vorgänge finden zu 100% lokal in Ihrem Browser statt.',
116
+ },
117
+ {
118
+ question: 'Wie funktioniert die XOR Obfuskation in Unity oder Godot?',
119
+ answer: 'Die XOR Obfuskation wendet bitweise XOR Operationen auf UTF-8 Bytes gegen einen geheimen Schlüssel an.',
120
+ },
121
+ ],
122
+ howTo: [
123
+ {
124
+ name: 'Datei Laden oder Einfügen',
125
+ text: 'Laden Sie Ihre verschlüsselte Speicherdatei hoch.',
126
+ },
127
+ {
128
+ name: 'Methode und Schlüssel Wählen',
129
+ text: 'Wählen Sie Base64 oder XOR und geben Sie den Schlüssel ein.',
130
+ },
131
+ {
132
+ name: 'JSON Bearbeiten',
133
+ text: 'Ändern Sie die Werte direkt im Live Editor.',
134
+ },
135
+ {
136
+ name: 'Verschlüsseln und Exportieren',
137
+ text: 'Laden Sie die neue Datei für Tests herunter.',
138
+ },
139
+ ],
140
+ schemas: [
141
+ {
142
+ '@context': 'https://schema.org',
143
+ '@type': 'SoftwareApplication',
144
+ name: 'Spiel Speicherstand Editor',
145
+ applicationCategory: 'DeveloperApplication',
146
+ operatingSystem: 'Any',
147
+ offers: {
148
+ '@type': 'Offer',
149
+ price: '0',
150
+ priceCurrency: 'EUR',
151
+ },
152
+ },
153
+ {
154
+ '@context': 'https://schema.org',
155
+ '@type': 'FAQPage',
156
+ mainEntity: [
157
+ {
158
+ '@type': 'Question',
159
+ name: 'Werden meine Speicherdaten hochgeladen?',
160
+ acceptedAnswer: {
161
+ '@type': 'Answer',
162
+ text: 'Nein. Alle Vorgänge finden zu 100% lokal statt.',
163
+ },
164
+ },
165
+ ],
166
+ },
167
+ {
168
+ '@context': 'https://schema.org',
169
+ '@type': 'HowTo',
170
+ name: 'So bearbeiten Sie Speicherstände',
171
+ step: [
172
+ {
173
+ '@type': 'HowToStep',
174
+ name: 'Datei Laden',
175
+ text: 'Laden Sie Ihre Speicherdatei hoch.',
176
+ },
177
+ ],
178
+ },
179
+ ],
180
+ bibliographyTitle: 'Referenzen und Weiterführende Literatur',
181
+ bibliography: bibliographyEntries,
182
+ };
@@ -0,0 +1,182 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { SaveFileEditorUI } from '../ui';
3
+ import { bibliographyEntries } from '../bibliography';
4
+
5
+ export const content: ToolLocaleContent<SaveFileEditorUI> = {
6
+ slug: 'game-save-file-editor',
7
+ title: 'Game Save File Obfuscator and Editor',
8
+ description: 'Decrypt, inspect, edit JSON payloads, and re-encrypt game save files using Base64, XOR masking, or plain text 100% locally in your browser.',
9
+ ui: {
10
+ title: 'Game Save File Obfuscator & Editor',
11
+ subtitle: 'Inspect, modify, and encrypt local save state files securely without server leaks',
12
+ dropSaveFile: 'Drag & Drop game save file here',
13
+ orSelectFile: 'or click to browse local file',
14
+ encryptionMethod: 'Encryption Format',
15
+ methodBase64: 'Base64 Encoding',
16
+ methodXor: 'XOR Mask + Base64',
17
+ methodRaw: 'Plain JSON / Unencrypted',
18
+ xorKeyLabel: 'XOR Secret Key',
19
+ xorKeyPlaceholder: 'e.g. MySecretGameKey2026',
20
+ jsonRawTitle: 'Decoded JSON Payload (Live Editor)',
21
+ encodeAndDownload: 'Encrypt & Download Save File',
22
+ copyEncoded: 'Copy Encrypted Text',
23
+ copiedNotice: 'Copied to Clipboard!',
24
+ decodedKeysCount: 'Total Parameters',
25
+ dataSize: 'Payload Size',
26
+ detectedFormat: 'Detected Format',
27
+ exportPreviewLabel: 'Encrypted Output Preview',
28
+ decodePanelTitle: 'Decode and Live JSON Editor',
29
+ exportPanelTitle: 'Re Encrypted Output Payload',
30
+ decodeError: 'Failed to decode save file',
31
+ bytesUnit: 'B',
32
+ },
33
+ seo: [
34
+ {
35
+ type: 'title',
36
+ level: 2,
37
+ text: 'Game Save File Security and Obfuscation Protocols',
38
+ },
39
+ {
40
+ type: 'paragraph',
41
+ html: 'Video games routinely serialize player progression state into persistent storage formats to maintain inventory counts, unlocked stages, player attributes, and narrative flags across play sessions. To prevent trivial end-user tampering via plain text editors, game studios obfuscate save states using binary encoding schemes like Base64 or bitwise XOR masking against a secret string key. During internal QA testing and live operations debugging, development teams require immediate capability to inspect raw JSON structures, force boundary test states, and re-encrypt modified payloads for deployment without recompiling game binaries.',
42
+ },
43
+ {
44
+ type: 'stats',
45
+ columns: 4,
46
+ items: [
47
+ { label: 'Client Processing Privacy', value: '100%' },
48
+ { label: 'Supported Decoders', value: 'Base64 / XOR / JSON' },
49
+ { label: 'Latency', value: '0 ms' },
50
+ { label: 'Data Leak Risk', value: 'Zero' },
51
+ ],
52
+ },
53
+ {
54
+ type: 'title',
55
+ level: 2,
56
+ text: 'Obfuscation Schemes Comparison',
57
+ },
58
+ {
59
+ type: 'comparative',
60
+ columns: 3,
61
+ items: [
62
+ {
63
+ title: 'Base64 Encoding',
64
+ description: 'Fast, lightweight string conversion that prevents casual end-user text edits in plain notepad but offers no cryptographic security.',
65
+ },
66
+ {
67
+ title: 'XOR Masking + Base64',
68
+ description: 'Standard practice in indie game development. Blends string bytes with a custom secret key to prevent casual memory editing or cheat engines.',
69
+ },
70
+ {
71
+ title: 'Plain JSON Payload',
72
+ description: 'Unencrypted readable save state. Ideal for initial prototyping, debug builds, and rapid internal team iterations.',
73
+ },
74
+ ],
75
+ },
76
+ {
77
+ type: 'title',
78
+ level: 2,
79
+ text: 'QA Testing Practices for Save State Verification',
80
+ },
81
+ {
82
+ type: 'tip',
83
+ title: 'Best Practices for Game Save Security during QA',
84
+ html: 'Always maintain separate debug keys for internal builds and production builds. When verifying edge-case bugs, use local tree inspectors to force inventory caps, boundary levels, and edge stats without recompiling game code.',
85
+ },
86
+ {
87
+ type: 'title',
88
+ level: 2,
89
+ text: 'Game State Parameter Guidelines Table',
90
+ },
91
+ {
92
+ type: 'table',
93
+ headers: ['Data Type', 'Recommended Format', 'Common Use Case', 'Obfuscation Layer'],
94
+ rows: [
95
+ ['Numeric Integers', '32-bit Integer', 'Coins, Level, XP, Ammo', 'XOR Masked'],
96
+ ['Boolean Flags', 'Standard Boolean', 'Tutorial Complete, Boss Defeated', 'Base64 / XOR'],
97
+ ['Nested Objects', 'JSON Hierarchy', 'Player Inventory, Skill Tree', 'Base64 Encoded'],
98
+ ['Timestamp Strings', 'ISO 8601 UTC', 'Daily Login, Save Timestamp', 'XOR Masked'],
99
+ ],
100
+ },
101
+ {
102
+ type: 'title',
103
+ level: 2,
104
+ text: 'Reverse Engineering and Anti Tamper Considerations',
105
+ },
106
+ {
107
+ type: 'paragraph',
108
+ html: 'While client-side obfuscation prevents casual players from modifying save files in standard text editors, XOR masking and Base64 encoding are not cryptographic algorithms. Memory scanners, cheat software, and reverse-engineering tools like RenderDoc or x64dbg can inspect key generation routines directly within compiled C++ or C# game assemblies. For competitive multiplayer titles, authoritative server validation or cryptographic HMAC signatures (such as SHA-256 integrity hashes appended to the save file payload) are essential to detect payload tampering upon game startup.',
109
+ },
110
+ ],
111
+ faqTitle: 'Frequently Asked Questions',
112
+ faq: [
113
+ {
114
+ question: 'Are my game save files uploaded to a remote server?',
115
+ answer: 'No. All decoding, JSON tree rendering, editing, and re-encoding happen 100% inside your web browser web workers and JavaScript engine.',
116
+ },
117
+ {
118
+ question: 'How does XOR key obfuscation work in game engines like Unity or Godot?',
119
+ answer: 'XOR obfuscation iterates over UTF-8 bytes of the serialized JSON string, applying a bitwise XOR operation against characters of a secret key, then encoding the resulting bytes in Base64.',
120
+ },
121
+ ],
122
+ howTo: [
123
+ {
124
+ name: 'Load or Paste Save File',
125
+ text: 'Upload your encrypted save file or select one of the built-in game presets (RPG, Platformer, Tycoon).',
126
+ },
127
+ {
128
+ name: 'Select Decoding Method and Key',
129
+ text: 'Choose Base64 or XOR Masking and enter the corresponding game secret key, then click Decode.',
130
+ },
131
+ {
132
+ name: 'Edit JSON State',
133
+ text: 'Use the interactive tree view or raw code tab to adjust levels, gold, inventory items, or game flags.',
134
+ },
135
+ {
136
+ name: 'Encrypt and Export',
137
+ text: 'Select your target output format and download your modified save file ready for game testing.',
138
+ },
139
+ ],
140
+ schemas: [
141
+ {
142
+ '@context': 'https://schema.org',
143
+ '@type': 'SoftwareApplication',
144
+ name: 'Game Save File Obfuscator and Editor',
145
+ applicationCategory: 'DeveloperApplication',
146
+ operatingSystem: 'Any',
147
+ offers: {
148
+ '@type': 'Offer',
149
+ price: '0',
150
+ priceCurrency: 'USD',
151
+ },
152
+ },
153
+ {
154
+ '@context': 'https://schema.org',
155
+ '@type': 'FAQPage',
156
+ mainEntity: [
157
+ {
158
+ '@type': 'Question',
159
+ name: 'Are my game save files uploaded to a remote server?',
160
+ acceptedAnswer: {
161
+ '@type': 'Answer',
162
+ text: 'No. All decoding and editing happen 100% inside your browser.',
163
+ },
164
+ },
165
+ ],
166
+ },
167
+ {
168
+ '@context': 'https://schema.org',
169
+ '@type': 'HowTo',
170
+ name: 'How to Edit Encrypted Game Save Files',
171
+ step: [
172
+ {
173
+ '@type': 'HowToStep',
174
+ name: 'Load or Paste Save File',
175
+ text: 'Upload your encrypted save file.',
176
+ },
177
+ ],
178
+ },
179
+ ],
180
+ bibliographyTitle: 'References and Further Reading',
181
+ bibliography: bibliographyEntries,
182
+ };