@jjlmoya/utils-games-development 1.63.0 → 1.65.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/category/index.ts +3 -1
- package/src/entries.ts +7 -1
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/seo_parity.test.ts +2 -2
- package/src/tests/seo_translation_completeness.test.ts +69 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tests/translation_copy.test.ts +21 -18
- package/src/tool/audioLoopPointFinder/i18n/de.ts +13 -0
- package/src/tool/audioLoopPointFinder/i18n/fr.ts +26 -0
- package/src/tool/audioLoopPointFinder/i18n/id.ts +4 -0
- package/src/tool/audioLoopPointFinder/i18n/it.ts +3 -0
- package/src/tool/audioLoopPointFinder/i18n/nl.ts +4 -0
- package/src/tool/audioLoopPointFinder/i18n/pl.ts +4 -0
- package/src/tool/audioLoopPointFinder/i18n/pt.ts +3 -0
- package/src/tool/audioLoopPointFinder/i18n/ru.ts +4 -0
- package/src/tool/audioLoopPointFinder/i18n/sv.ts +4 -0
- package/src/tool/audioLoopPointFinder/i18n/tr.ts +4 -0
- package/src/tool/audioLoopPointFinder/i18n/zh.ts +4 -0
- package/src/tool/damageFormulaLab/bibliography.astro +24 -0
- package/src/tool/damageFormulaLab/bibliography.ts +10 -0
- package/src/tool/damageFormulaLab/component.astro +178 -0
- package/src/tool/damageFormulaLab/controller.ts +235 -0
- package/src/tool/damageFormulaLab/damage-formula-lab.css +644 -0
- package/src/tool/damageFormulaLab/dom-views.ts +193 -0
- package/src/tool/damageFormulaLab/entry.ts +28 -0
- package/src/tool/damageFormulaLab/evaluator.ts +84 -0
- package/src/tool/damageFormulaLab/expression.ts +191 -0
- package/src/tool/damageFormulaLab/i18n/de.ts +194 -0
- package/src/tool/damageFormulaLab/i18n/en.ts +231 -0
- package/src/tool/damageFormulaLab/i18n/es.ts +181 -0
- package/src/tool/damageFormulaLab/i18n/fr.ts +194 -0
- package/src/tool/damageFormulaLab/i18n/id.ts +194 -0
- package/src/tool/damageFormulaLab/i18n/it.ts +182 -0
- package/src/tool/damageFormulaLab/i18n/ja.ts +183 -0
- package/src/tool/damageFormulaLab/i18n/ko.ts +182 -0
- package/src/tool/damageFormulaLab/i18n/nl.ts +182 -0
- package/src/tool/damageFormulaLab/i18n/pl.ts +182 -0
- package/src/tool/damageFormulaLab/i18n/pt.ts +182 -0
- package/src/tool/damageFormulaLab/i18n/ru.ts +183 -0
- package/src/tool/damageFormulaLab/i18n/sv.ts +183 -0
- package/src/tool/damageFormulaLab/i18n/tr.ts +183 -0
- package/src/tool/damageFormulaLab/i18n/zh.ts +183 -0
- package/src/tool/damageFormulaLab/index.ts +11 -0
- package/src/tool/damageFormulaLab/logic.test.ts +138 -0
- package/src/tool/damageFormulaLab/logic.ts +138 -0
- package/src/tool/damageFormulaLab/model.ts +151 -0
- package/src/tool/damageFormulaLab/seo.astro +13 -0
- package/src/tool/damageFormulaLab/storage.ts +62 -0
- package/src/tool/damageFormulaLab/transfers.ts +89 -0
- package/src/tool/damageFormulaLab/ui.ts +62 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/bibliography.astro +22 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/bibliography.ts +10 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/component.astro +51 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/controller.ts +79 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/dom-views.ts +88 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/entry.ts +27 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/evaluator.ts +21 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/game-delta-time-fixed-timestep-lab.css +491 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/de.ts +56 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/en.ts +180 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/es.ts +56 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/fr.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/id.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/it.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/ja.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/ko.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/nl.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/pl.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/pt.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/ru.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/sv.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/tr.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/i18n/zh.ts +46 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/index.ts +11 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/logic.test.ts +35 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/logic.ts +140 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/seo.astro +15 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/seo_contract.test.ts +25 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/storage.ts +23 -0
- package/src/tool/gameDeltaTimeFixedTimestepLab/ui.ts +54 -0
- package/src/tool/gameUIAccessibilityTester/i18n/de.ts +13 -0
- package/src/tool/gameUIAccessibilityTester/i18n/fr.ts +13 -0
- package/src/tool/gameUIAccessibilityTester/i18n/id.ts +13 -0
- package/src/tool/gameUIAccessibilityTester/i18n/it.ts +1 -0
- package/src/tool/gameUIAccessibilityTester/i18n/nl.ts +5 -0
- package/src/tool/gameUIAccessibilityTester/i18n/pl.ts +5 -0
- package/src/tool/gameUIAccessibilityTester/i18n/pt.ts +2 -0
- package/src/tool/gameUIAccessibilityTester/i18n/ru.ts +1 -0
- package/src/tool/gameUIAccessibilityTester/i18n/sv.ts +1 -0
- package/src/tool/gameUIAccessibilityTester/i18n/tr.ts +2 -0
- package/src/tool/gameUIAccessibilityTester/i18n/zh.ts +1 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/de.ts +14 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/fr.ts +13 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/id.ts +13 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/it.ts +1 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/nl.ts +1 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/pl.ts +2 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/pt.ts +2 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/ru.ts +2 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/sv.ts +1 -0
- package/src/tool/hitboxHurtboxAnimator/i18n/tr.ts +2 -0
- package/src/tool/itchioGameTester/i18n/de.ts +13 -0
- package/src/tool/itchioGameTester/i18n/es.ts +2 -2
- package/src/tool/itchioGameTester/i18n/fr.ts +26 -0
- package/src/tool/itchioGameTester/i18n/id.ts +3 -0
- package/src/tool/itchioGameTester/i18n/it.ts +3 -0
- package/src/tool/itchioGameTester/i18n/ja.ts +3 -0
- package/src/tool/itchioGameTester/i18n/ko.ts +3 -0
- package/src/tool/itchioGameTester/i18n/nl.ts +3 -0
- package/src/tool/itchioGameTester/i18n/pl.ts +3 -0
- package/src/tool/itchioGameTester/i18n/pt.ts +3 -0
- package/src/tool/itchioGameTester/i18n/ru.ts +3 -0
- package/src/tool/itchioGameTester/i18n/sv.ts +3 -0
- package/src/tool/itchioGameTester/i18n/tr.ts +3 -0
- package/src/tool/itchioGameTester/i18n/zh.ts +3 -0
- package/src/tool/localizationSanitizer/i18n/de.ts +13 -0
- package/src/tool/localizationSanitizer/i18n/es.ts +26 -0
- package/src/tool/localizationSanitizer/i18n/fr.ts +4 -0
- package/src/tool/localizationSanitizer/i18n/id.ts +4 -0
- package/src/tool/localizationSanitizer/i18n/it.ts +4 -0
- package/src/tool/localizationSanitizer/i18n/ja.ts +4 -0
- package/src/tool/localizationSanitizer/i18n/ko.ts +4 -0
- package/src/tool/localizationSanitizer/i18n/nl.ts +5 -0
- package/src/tool/localizationSanitizer/i18n/pl.ts +5 -0
- package/src/tool/localizationSanitizer/i18n/pt.ts +5 -0
- package/src/tool/localizationSanitizer/i18n/ru.ts +5 -0
- package/src/tool/localizationSanitizer/i18n/sv.ts +5 -0
- package/src/tool/localizationSanitizer/i18n/tr.ts +5 -0
- package/src/tool/localizationSanitizer/i18n/zh.ts +6 -0
- package/src/tool/pixelArtPaletteSwapper/i18n/ja.ts +13 -0
- package/src/tool/pixelArtPaletteSwapper/i18n/ko.ts +13 -0
- package/src/tool/pixelArtPaletteSwapper/i18n/zh.ts +18 -0
- package/src/tool/retroSfxGenerator/i18n/de.ts +13 -0
- package/src/tool/retroSfxGenerator/i18n/fr.ts +13 -0
- package/src/tool/retroSfxGenerator/i18n/id.ts +13 -0
- package/src/tool/retroSfxGenerator/i18n/it.ts +1 -0
- package/src/tool/retroSfxGenerator/i18n/nl.ts +1 -0
- package/src/tool/retroSfxGenerator/i18n/pl.ts +1 -0
- package/src/tool/retroSfxGenerator/i18n/pt.ts +1 -0
- package/src/tool/retroSfxGenerator/i18n/ru.ts +1 -0
- package/src/tool/retroSfxGenerator/i18n/sv.ts +2 -0
- package/src/tool/retroSfxGenerator/i18n/tr.ts +1 -0
- package/src/tool/retroSfxGenerator/i18n/zh.ts +1 -0
- package/src/tool/spriteSheetPacker/i18n/de.ts +13 -0
- package/src/tool/spriteSheetPacker/i18n/es.ts +2 -2
- package/src/tool/spriteSheetPacker/i18n/fr.ts +26 -0
- package/src/tool/spriteSheetPacker/i18n/id.ts +4 -0
- package/src/tool/spriteSheetPacker/i18n/it.ts +4 -0
- package/src/tool/spriteSheetPacker/i18n/ja.ts +3 -0
- package/src/tool/spriteSheetPacker/i18n/ko.ts +3 -0
- package/src/tool/spriteSheetPacker/i18n/nl.ts +4 -0
- package/src/tool/spriteSheetPacker/i18n/pl.ts +4 -0
- package/src/tool/spriteSheetPacker/i18n/pt.ts +4 -0
- package/src/tool/spriteSheetPacker/i18n/ru.ts +4 -0
- package/src/tool/spriteSheetPacker/i18n/sv.ts +4 -0
- package/src/tool/spriteSheetPacker/i18n/tr.ts +4 -0
- package/src/tool/spriteSheetPacker/i18n/zh.ts +4 -0
- package/src/tool/steamBbcodeTranslator/i18n/de.ts +22 -0
- package/src/tool/steamBbcodeTranslator/i18n/es.ts +23 -1
- package/src/tool/steamBbcodeTranslator/i18n/fr.ts +6 -1
- package/src/tool/steamBbcodeTranslator/i18n/id.ts +7 -1
- package/src/tool/steamBbcodeTranslator/i18n/it.ts +6 -1
- package/src/tool/steamBbcodeTranslator/i18n/ja.ts +5 -1
- package/src/tool/steamBbcodeTranslator/i18n/ko.ts +5 -1
- package/src/tool/steamBbcodeTranslator/i18n/nl.ts +7 -1
- package/src/tool/steamBbcodeTranslator/i18n/pl.ts +7 -1
- package/src/tool/steamBbcodeTranslator/i18n/pt.ts +7 -1
- package/src/tool/steamBbcodeTranslator/i18n/ru.ts +7 -1
- package/src/tool/steamBbcodeTranslator/i18n/sv.ts +7 -1
- package/src/tool/steamBbcodeTranslator/i18n/tr.ts +7 -1
- package/src/tool/steamBbcodeTranslator/i18n/zh.ts +5 -1
- package/src/tool/steamCapsuleGenerator/i18n/de.ts +2 -2
- package/src/tool/steamCapsuleGenerator/i18n/es.ts +2 -2
- package/src/tool/steamCapsuleGenerator/i18n/fr.ts +2 -2
- package/src/tool/steamCapsuleGenerator/i18n/pl.ts +13 -0
- package/src/tool/steamCapsuleGenerator/i18n/ru.ts +26 -0
- package/src/tool/steamCapsuleGenerator/i18n/sv.ts +1 -0
- package/src/tool/steamCapsuleGenerator/i18n/tr.ts +1 -0
- package/src/tools.ts +4 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { DamageFormulaLabUI } from '../ui';
|
|
4
|
+
import { bibliographyEntries } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'calculadora-formulas-dano-jogos-ttk';
|
|
7
|
+
const title = 'Laboratório de Fórmulas de Dano e Gráficos TTK';
|
|
8
|
+
const description = 'Compare fórmulas de dano para jogos em tempo real com curvas dinâmicas, mapas de calor de ataque e defesa, arredondamentos e tempo para derrotar (TTK).';
|
|
9
|
+
|
|
10
|
+
const faq = [
|
|
11
|
+
{
|
|
12
|
+
question: 'O que a calculadora de fórmulas de dano compara?',
|
|
13
|
+
answer: 'Ela executa duas expressões matemáticas seguras sobre os mesmos atributos de combate. Permite comparar curvas de dano, limiares de golpes, tempo para derrotar (TTK), regras de arredondamento e ordem de resistências.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Quais variáveis e funções posso utilizar?',
|
|
17
|
+
answer: 'As variáveis disponíveis são attack, defense, level, power, resistance, flat, criticalChance e criticalMultiplier. As funções seguras são min, max, clamp, abs, sqrt, pow, floor, round e ceil.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Como o tempo para derrotar (TTK) é calculado?',
|
|
21
|
+
answer: 'Os golpes necessários são a vida do alvo dividida pelo dano esperado arredondado (arredondado para cima). O TTK mede o intervalo entre o primeiro e o último golpe: (golpes - 1) / ataques por segundo.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Por que a ordem das resistências altera o resultado?',
|
|
25
|
+
answer: 'Aplicar um modificador plano antes da resistência percentual reduz também esse valor plano. Aplicar a resistência primeiro deixa o modificador plano posterior intacto.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: 'Uma curva suave garante um jogo balanceado?',
|
|
29
|
+
answer: 'Não. Uma curva revela limiares e zonas de dano zero, mas o balanceamento depende do contexto do jogo, papéis das unidades e testes de jogo.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howTo = [
|
|
34
|
+
{ name: 'Escolher duas fórmulas', text: 'Comece a partir de um modelo predefinido (linear, proporção ou nível) ou digite suas próprias fórmulas A e B.' },
|
|
35
|
+
{ name: 'Ajustar os atributos de combate', text: 'Insira valores de ataque, defesa, nível, poder, resistência, modificador plano, críticos, vida e cadência.' },
|
|
36
|
+
{ name: 'Definir regras do motor', text: 'Escolha como o dano é arredondado e se a resistência se aplica antes ou depois do modificador plano.' },
|
|
37
|
+
{ name: 'Analisar curvas e limiares', text: 'Compare a trajetória do ataque, o mapa de calor da defesa, os golpes necessários e os avisos de diagnóstico.' },
|
|
38
|
+
{ name: 'Salvar o experimento', text: 'Copie um link de compartilhamento ou baixe a configuração em JSON, a tabela em CSV ou o gráfico em PNG.' },
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const softwareApplication: WithContext<SoftwareApplication> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'SoftwareApplication',
|
|
44
|
+
name: title,
|
|
45
|
+
applicationCategory: 'DeveloperApplication',
|
|
46
|
+
operatingSystem: 'Any',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const faqPage: WithContext<FAQPage> = {
|
|
50
|
+
'@context': 'https://schema.org',
|
|
51
|
+
'@type': 'FAQPage',
|
|
52
|
+
mainEntity: faq.map((item) => ({
|
|
53
|
+
'@type': 'Question',
|
|
54
|
+
name: item.question,
|
|
55
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
56
|
+
})),
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const howToSchema: WithContext<HowTo> = {
|
|
60
|
+
'@context': 'https://schema.org',
|
|
61
|
+
'@type': 'HowTo',
|
|
62
|
+
name: title,
|
|
63
|
+
step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const content: ToolLocaleContent<DamageFormulaLabUI> = {
|
|
67
|
+
slug,
|
|
68
|
+
title,
|
|
69
|
+
description,
|
|
70
|
+
ui: {
|
|
71
|
+
onboarding: 'Insira a fórmula de dano atual, coloque uma alternativa ao lado e ajuste os atributos de combate.',
|
|
72
|
+
localNote: 'Modelo privado. Fórmulas e dados permanecem neste navegador.',
|
|
73
|
+
formulaDeck: 'Câmara de fórmulas',
|
|
74
|
+
formulaALabel: 'Fórmula A (Modelo atual)',
|
|
75
|
+
formulaBLabel: 'Fórmula B (Alternativa)',
|
|
76
|
+
formulaHint: 'Variáveis: attack, defense, level, power, resistance, flat, criticalChance, criticalMultiplier',
|
|
77
|
+
formulaFunctions: 'Funções seguras: min, max, clamp, abs, sqrt, pow, floor, round, ceil',
|
|
78
|
+
presetLinear: 'Proteção linear',
|
|
79
|
+
presetRatio: 'Armadura por proporção',
|
|
80
|
+
presetLevel: 'Escalamento por nível',
|
|
81
|
+
combatInputs: 'Atributos de combate',
|
|
82
|
+
attackLabel: 'Ataque',
|
|
83
|
+
defenseLabel: 'Defesa',
|
|
84
|
+
levelLabel: 'Nível',
|
|
85
|
+
powerLabel: 'Coeficiente de poder',
|
|
86
|
+
resistanceLabel: 'Resistência (%)',
|
|
87
|
+
flatLabel: 'Modificador plano',
|
|
88
|
+
criticalChanceLabel: 'Chance de crítico (%)',
|
|
89
|
+
criticalMultiplierLabel: 'Multiplicador de crítico',
|
|
90
|
+
healthLabel: 'Vida do alvo',
|
|
91
|
+
cadenceLabel: 'Ataques por segundo',
|
|
92
|
+
roundingLabel: 'Arredondamento do dano',
|
|
93
|
+
roundingNone: 'Manter decimais',
|
|
94
|
+
roundingFloor: 'Arredondar para baixo (Floor)',
|
|
95
|
+
roundingRound: 'Inteiro mais próximo',
|
|
96
|
+
roundingCeil: 'Arredondar para cima (Ceil)',
|
|
97
|
+
orderLabel: 'Ordem dos modificadores',
|
|
98
|
+
resistanceFirst: 'Resistência depois plano',
|
|
99
|
+
flatFirst: 'Plano depois resistência',
|
|
100
|
+
runLabel: 'Comparação de impacto em tempo real',
|
|
101
|
+
resultDamage: 'Dano esperado',
|
|
102
|
+
resultHits: 'Golpes para derrotar',
|
|
103
|
+
resultTtk: 'Tempo para derrotar (TTK)',
|
|
104
|
+
resultDifference: 'Diferença de dano',
|
|
105
|
+
formulaAName: 'Atual',
|
|
106
|
+
formulaBName: 'Alternativa',
|
|
107
|
+
curveTitle: 'Trajetória do ataque',
|
|
108
|
+
curveCaption: 'O ataque varia da metade ao dobro do valor atual enquanto a defesa permanece fixa.',
|
|
109
|
+
heatmapTitle: 'Mapa de calor de pressão',
|
|
110
|
+
heatmapCaption: 'Mostra o dano esperado da Fórmula A em combinações de ataque e defesa.',
|
|
111
|
+
attackAxis: 'O ataque aumenta para a direita',
|
|
112
|
+
defenseAxis: 'A defesa aumenta para baixo',
|
|
113
|
+
scenariosTitle: 'Perfis de combate',
|
|
114
|
+
scenarioSkirmisher: 'Combatente',
|
|
115
|
+
scenarioGuardian: 'Guardião',
|
|
116
|
+
scenarioBoss: 'Chefe',
|
|
117
|
+
scenarioCustom: 'Configuração atual',
|
|
118
|
+
diagnosticsTitle: 'Verificação de limiares',
|
|
119
|
+
statusBalanced: 'Nenhuma anomalia matemática detectada neste intervalo de teste.',
|
|
120
|
+
exportTitle: 'Exportar experimento',
|
|
121
|
+
copyLink: 'Copiar link',
|
|
122
|
+
exportCsv: 'Baixar CSV',
|
|
123
|
+
exportJson: 'Baixar JSON',
|
|
124
|
+
importJson: 'Importar JSON',
|
|
125
|
+
exportPng: 'Baixar PNG do gráfico',
|
|
126
|
+
reset: 'Restaurar modelo',
|
|
127
|
+
privacyDisclosure: 'O link de compartilhamento salva a configuração na URL sem enviar dados a servidores.',
|
|
128
|
+
limitationDisclosure: 'O dano crítico esperado é uma média e não uma simulação aleatória.',
|
|
129
|
+
importError: 'O arquivo selecionado não é uma configuração válida.',
|
|
130
|
+
copiedStatus: 'Link copiado para a área de transferência.',
|
|
131
|
+
},
|
|
132
|
+
seo: [
|
|
133
|
+
{
|
|
134
|
+
type: 'title',
|
|
135
|
+
level: 2,
|
|
136
|
+
text: 'Testar fórmulas de dano antes de integrar ao motor do jogo',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
html: 'Uma fórmula de dano pode parecer correta em valores médios mas falhar nos extremos da progressão. Este laboratório permite identificar limiares e zonas de dano nulo antecipadamente.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
level: 2,
|
|
145
|
+
text: 'Linguagem de expressão segura e restrita',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: 'O campo aceita exclusivamente variáveis e funções matemáticas predefinidas sem executar código arbitrário.',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'table',
|
|
153
|
+
headers: ['Métrica', 'Cálculo realizado', 'Questão de design'],
|
|
154
|
+
rows: [
|
|
155
|
+
['Dano esperado', 'Fórmula base incluindo fator crítico e ordem de resistência', 'A regra responde de forma coerente em personagens fracos e fortes?'],
|
|
156
|
+
['Golpes para derrotar', 'Vida do alvo dividida pelo dano arredondado', 'Um único ponto de atributo elimina um golpe inteiro necessário?'],
|
|
157
|
+
['Tempo para derrotar (TTK)', 'Intervalo entre golpes dividido pela cadência de ataque', 'A cadência cria o ritmo de combate desejado?'],
|
|
158
|
+
['Mapa de calor', 'Amostragem da Fórmula A sobre ataque e defesa', 'Existem zonas mortas ou saltos inesperados?'],
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'title',
|
|
163
|
+
level: 2,
|
|
164
|
+
text: 'Separar a matemática das decisões de balanceamento',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'paragraph',
|
|
168
|
+
html: 'Um gráfico fluido não garante um jogo divertido. Use este laboratório para identificar hipóteses a serem testadas com jogadores.',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: 'tip',
|
|
172
|
+
title: 'Examine o dano e o número de golpes juntos',
|
|
173
|
+
html: 'Uma pequena alteração no dano pode cruzar um limiar de vida e eliminar um golpe completo. Compare sempre o dano com o TTK.',
|
|
174
|
+
},
|
|
175
|
+
{ type: 'paragraph', html: 'A mesma fórmula pode produzir um combate diferente conforme o arredondamento e a ordem dos modificadores. Confira também danos pequenos, defesa alta e o limite que exige um golpe extra; o TTK não modela esquivas, recargas ou interrupções.' },
|
|
176
|
+
],
|
|
177
|
+
faq,
|
|
178
|
+
bibliographyTitle: 'Referências de cálculo de dano em jogos',
|
|
179
|
+
bibliography: bibliographyEntries,
|
|
180
|
+
howTo,
|
|
181
|
+
schemas: [softwareApplication, faqPage, howToSchema],
|
|
182
|
+
};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { DamageFormulaLabUI } from '../ui';
|
|
4
|
+
import { bibliographyEntries } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'kalkulyator-formul-yrona-igr-ttk';
|
|
7
|
+
const title = 'Лаборатория Формул Урона и Графиков TTK';
|
|
8
|
+
const description = 'Сравнивайте формулы урона в играх в реальном времени с помощью графиков, тепловых карт, правил округления и времени уничтожения цели (TTK).';
|
|
9
|
+
|
|
10
|
+
const faq = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Что сравнивает калькулятор формул урона?',
|
|
13
|
+
answer: 'Он вычисляет две безопасные математические формулы для одних и тех же боевых параметров. Вы можете сравнивать кривые урона, пороги количества ударов, время уничтожения (TTK) и порядок применения брони.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Какие переменные и функции можно использовать?',
|
|
17
|
+
answer: 'Доступные переменные: attack, defense, level, power, resistance, flat, criticalChance и criticalMultiplier. Безопасные функции: min, max, clamp, abs, sqrt, pow, floor, round и ceil.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Как рассчитывается время уничтожения цели (TTK)?',
|
|
21
|
+
answer: 'Количество ударов равно здоровью цели, деленному на округленный ожидаемый урон (с округлением вверх). TTK измеряет интервал между первым и последним ударом: (удары - 1) / атак в секунду.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Почему порядок применения сопротивления имеет значение?',
|
|
25
|
+
answer: 'Применение плоского модификатора перед процентным сопротивлением также уменьшает этот плоский модификатор. Применение сопротивления первым оставляет плоский модификатор без изменений.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: 'Гарантирует ли гладкий график баланс в игре?',
|
|
29
|
+
answer: 'Нет. График показывает пороговые значения и зоны нулевого урона, но баланс зависит от контекста игры, ролей и плейтестов.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howTo = [
|
|
34
|
+
{ name: 'Выберите две формулы', text: 'Начните с готового шаблона (линейный, соотношение, скалирование по уровню) или введите свои формулы A и B.' },
|
|
35
|
+
{ name: 'Настройте боевые параметры', text: 'Укажите значения атаки, защиты, уровня, коэффициента силы, сопротивления, плоского модификатора, критических ударов и здоровья.' },
|
|
36
|
+
{ name: 'Задайте правила движка', text: 'Выберите режим округления урона и порядок применения сопротивления.' },
|
|
37
|
+
{ name: 'Проанализируйте графики и пороги', text: 'Сравните кривую урона, тепловую карту защиты, количество ударов и предупреждения.' },
|
|
38
|
+
{ name: 'Сохраните эксперимент', text: 'Скопируйте ссылку для compartir или скачайте конфигурацию в JSON, таблицу CSV или PNG-график.' },
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const softwareApplication: WithContext<SoftwareApplication> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'SoftwareApplication',
|
|
44
|
+
name: title,
|
|
45
|
+
applicationCategory: 'DeveloperApplication',
|
|
46
|
+
operatingSystem: 'Any',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const faqPage: WithContext<FAQPage> = {
|
|
50
|
+
'@context': 'https://schema.org',
|
|
51
|
+
'@type': 'FAQPage',
|
|
52
|
+
mainEntity: faq.map((item) => ({
|
|
53
|
+
'@type': 'Question',
|
|
54
|
+
name: item.question,
|
|
55
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
56
|
+
})),
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const howToSchema: WithContext<HowTo> = {
|
|
60
|
+
'@context': 'https://schema.org',
|
|
61
|
+
'@type': 'HowTo',
|
|
62
|
+
name: title,
|
|
63
|
+
step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const content: ToolLocaleContent<DamageFormulaLabUI> = {
|
|
67
|
+
slug,
|
|
68
|
+
title,
|
|
69
|
+
description,
|
|
70
|
+
ui: {
|
|
71
|
+
onboarding: 'Введите текущую формулу урона, укажите альтернативную рядом и настройте боевые параметры.',
|
|
72
|
+
localNote: 'Приватная модель. Формулы и файлы остаются в вашем браузере.',
|
|
73
|
+
formulaDeck: 'Панель формул',
|
|
74
|
+
formulaALabel: 'Формула A (Текущая модель)',
|
|
75
|
+
formulaBLabel: 'Формула B (Альтернатива)',
|
|
76
|
+
formulaHint: 'Переменные: attack, defense, level, power, resistance, flat, criticalChance, criticalMultiplier',
|
|
77
|
+
formulaFunctions: 'Функции: min, max, clamp, abs, sqrt, pow, floor, round, ceil',
|
|
78
|
+
presetLinear: 'Линейная защита',
|
|
79
|
+
presetRatio: 'Броня соотношения',
|
|
80
|
+
presetLevel: 'Скалирование уровня',
|
|
81
|
+
combatInputs: 'Боевые параметры',
|
|
82
|
+
attackLabel: 'Атака',
|
|
83
|
+
defenseLabel: 'Защита',
|
|
84
|
+
levelLabel: 'Уровень',
|
|
85
|
+
powerLabel: 'Коэффициент силы',
|
|
86
|
+
resistanceLabel: 'Сопротивление (%)',
|
|
87
|
+
flatLabel: 'Плоский модификатор',
|
|
88
|
+
criticalChanceLabel: 'Шанс крит. удара (%)',
|
|
89
|
+
criticalMultiplierLabel: 'Множитель крит. удара',
|
|
90
|
+
healthLabel: 'Здоровье цели',
|
|
91
|
+
cadenceLabel: 'Атак в секунду',
|
|
92
|
+
roundingLabel: 'Округление урона',
|
|
93
|
+
roundingNone: 'Сохранять десятичные',
|
|
94
|
+
roundingFloor: 'Округление вниз (Floor)',
|
|
95
|
+
roundingRound: 'Ближайшее целое',
|
|
96
|
+
roundingCeil: 'Округление вверх (Ceil)',
|
|
97
|
+
orderLabel: 'Порядок модификаторов',
|
|
98
|
+
resistanceFirst: 'Сопротивление, затем плоский',
|
|
99
|
+
flatFirst: 'Плоский, затем сопротивление',
|
|
100
|
+
runLabel: 'Сравнение в реальном времени',
|
|
101
|
+
resultDamage: 'Ожидаемый урон',
|
|
102
|
+
resultHits: 'Ударов до уничтожения',
|
|
103
|
+
resultTtk: 'Время уничтожения (TTK)',
|
|
104
|
+
resultDifference: 'Разница урона',
|
|
105
|
+
formulaAName: 'Текущая',
|
|
106
|
+
formulaBName: 'Альтернатива',
|
|
107
|
+
curveTitle: 'График зависимости от атаки',
|
|
108
|
+
curveCaption: 'Атака меняется от половины до двойного значения при фиксированной защите.',
|
|
109
|
+
heatmapTitle: 'Тепловая карта давления',
|
|
110
|
+
heatmapCaption: 'Показывает ожидаемый урон Формулы A для комбинаций атаки и защиты.',
|
|
111
|
+
attackAxis: 'Атака растет вправо',
|
|
112
|
+
defenseAxis: 'Защита растет вниз',
|
|
113
|
+
scenariosTitle: 'Боевые профили',
|
|
114
|
+
scenarioSkirmisher: 'Дуэлянт',
|
|
115
|
+
scenarioGuardian: 'Страж',
|
|
116
|
+
scenarioBoss: 'Босс',
|
|
117
|
+
scenarioCustom: 'Текущие настройки',
|
|
118
|
+
diagnosticsTitle: 'Проверка порогов',
|
|
119
|
+
statusBalanced: 'В данном диапазоне аномальных математических скачков не обнаружено.',
|
|
120
|
+
exportTitle: 'Экспорт эксперимента',
|
|
121
|
+
copyLink: 'Скопировать ссылку',
|
|
122
|
+
exportCsv: 'Скачать CSV',
|
|
123
|
+
exportJson: 'Скачать JSON',
|
|
124
|
+
importJson: 'Импортировать JSON',
|
|
125
|
+
exportPng: 'Скачать PNG-график',
|
|
126
|
+
reset: 'Сбросить модель',
|
|
127
|
+
privacyDisclosure: 'Ссылка сохраняет настройки в хэше URL и не отправляет данные на сервер.',
|
|
128
|
+
limitationDisclosure: 'Ожидаемый критический урон является средним значением, а не случайной симуляцией.',
|
|
129
|
+
importError: 'Файл не является корректной конфигурацией.',
|
|
130
|
+
copiedStatus: 'Ссылка скопирована в буфер обмена.',
|
|
131
|
+
},
|
|
132
|
+
seo: [
|
|
133
|
+
{
|
|
134
|
+
type: 'title',
|
|
135
|
+
level: 2,
|
|
136
|
+
text: 'Тестируйте формулы урона до интеграции в игровой движок',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
html: 'Формула урона может выглядеть корректной при базовых значениях, но ломаться на высоких уровнях. Данная лаборатория позволяет выявить аномалии заранее.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
level: 2,
|
|
145
|
+
text: 'Безопасный и ограниченный язык выражений',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: 'Поле ввода принимает исключительно предустановленные переменные и математические функции без выполнения стороннего кода.',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'table',
|
|
153
|
+
headers: ['Показатель', 'Расчет', 'Вопрос дизайна'],
|
|
154
|
+
rows: [
|
|
155
|
+
['Ожидаемый урон', 'Базовая формула с учетом критических ударов и сопротивления', 'Адекватно ли работает правило для слабых и сильных персонажей?'],
|
|
156
|
+
['Ударов до уничтожения', 'Здоровье цели, деленное на округленный урон', 'Убирает ли 1 дополнительное очко характеристик целый необходимый удар?'],
|
|
157
|
+
['Время уничтожения (TTK)', 'Интервал между ударами, деленный на скорость атаки', 'Создает ли скорость атаки желаемый темп боя?'],
|
|
158
|
+
['Тепловая карта', 'Выборка Формулы A по атаке и защите', 'Есть ли аномальные скачки или мертвые зоны?'],
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'title',
|
|
163
|
+
level: 2,
|
|
164
|
+
text: 'Разделение математических расчетов и решений по балансу',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'paragraph',
|
|
168
|
+
html: 'Гладкий график не гарантирует увлекательный геймплей. Используйте лабораторию для формулирования гипотез перед плейтестами.',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: 'tip',
|
|
172
|
+
title: 'Анализируйте урон и количество ударов одновременно',
|
|
173
|
+
html: 'Небольшое изменение урона может пересечь пороговое значение здоровья и сократить число ударов. Всегда сравнивайте урон с TTK.',
|
|
174
|
+
},
|
|
175
|
+
{ type: 'paragraph', html: 'Одна и та же формула может дать другой бой из-за округления и порядка модификаторов. Проверьте также малый урон, высокую защиту и порог дополнительного удара; TTK не моделирует уклонения, перезарядки и прерывания.' },
|
|
176
|
+
{ type: 'paragraph', html: 'После выбора формулы сохраните несколько контрольных сценариев: слабая атака против высокой защиты, критический удар и граница, на которой меняется число попаданий. Такие примеры помогают сравнить версии баланса и заметить регрессию после изменения коэффициентов или правил округления.' },
|
|
177
|
+
],
|
|
178
|
+
faq,
|
|
179
|
+
bibliographyTitle: 'Ссылки по расчету урона в играх',
|
|
180
|
+
bibliography: bibliographyEntries,
|
|
181
|
+
howTo,
|
|
182
|
+
schemas: [softwareApplication, faqPage, howToSchema],
|
|
183
|
+
};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { DamageFormulaLabUI } from '../ui';
|
|
4
|
+
import { bibliographyEntries } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'spel-skadeformel-raknare-ttk';
|
|
7
|
+
const title = 'Skadeformellabb med TTK diagram';
|
|
8
|
+
const description = 'Jämför säkra skadeformler för spel i realtid med livekurvor, heatmaps för attack och försvar, avrundningsregler och Time to Kill (TTK).';
|
|
9
|
+
|
|
10
|
+
const faq = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Vad jämför skadeformelräknaren?',
|
|
13
|
+
answer: 'Den kör två säkra matematiska uttryck mot samma stridsvärden. Du kan jämföra skadekurvor, trösklar för antal träffar, time to kill (TTK), avrundningsregler och ordningen för motstånd.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Vilka variabler och funktioner kan jag använda?',
|
|
17
|
+
answer: 'Tillgängliga variabler är attack, defense, level, power, resistance, flat, criticalChance och criticalMultiplier. Säkra funktioner inkluderar min, max, clamp, abs, sqrt, pow, floor, round och ceil.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Hur beräknas time to kill (TTK)?',
|
|
21
|
+
answer: 'Antal träffar är målets hälsa dividerat med avrundad förväntad skada (avrundat uppåt). TTK mäter intervallet mellan första och sista träffen: (träffar - 1) / attacker per sekund.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Varför spelar ordningen för motstånd roll?',
|
|
25
|
+
answer: 'Om en fast modifierare tillämpas före procentuellt motstånd minskar motståndet även det fasta värdet. Om motstånd tillämpas först förblir det fasta värdet opåverkat.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: 'Betyder en jämn kurva att spelet är balanserat?',
|
|
29
|
+
answer: 'Nej. En kurva visar trösklar och zoner med noll skada, men balans beror på spelkontext, roller och speltester.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howTo = [
|
|
34
|
+
{ name: 'Välj två formler', text: 'Starta från en förinställning (linjär, förhållande eller nivåskalning) eller skriv två egna formler.' },
|
|
35
|
+
{ name: 'Ställ in stridsvärden', text: 'Ange värden för attack, försvar, nivå, kraftkoefficient, motstånd, fast modifierare, kritiska värden, hälsa och attackhastighet.' },
|
|
36
|
+
{ name: 'Bestäm regler för motorn', text: 'Välj hur skada avrundas och om motstånd gäller före eller efter den fasta modifieraren.' },
|
|
37
|
+
{ name: 'Analysera kurvor och trösklar', text: 'Jämför skadeförlopp, heatmap för försvar, antal träffar och diagnostiska varningar.' },
|
|
38
|
+
{ name: 'Spara experimentet', text: 'Kopiera en delningslänk eller ladda ner konfigurationen som JSON, CSV eller PNG-diagram.' },
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const softwareApplication: WithContext<SoftwareApplication> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'SoftwareApplication',
|
|
44
|
+
name: title,
|
|
45
|
+
applicationCategory: 'DeveloperApplication',
|
|
46
|
+
operatingSystem: 'Any',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const faqPage: WithContext<FAQPage> = {
|
|
50
|
+
'@context': 'https://schema.org',
|
|
51
|
+
'@type': 'FAQPage',
|
|
52
|
+
mainEntity: faq.map((item) => ({
|
|
53
|
+
'@type': 'Question',
|
|
54
|
+
name: item.question,
|
|
55
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
56
|
+
})),
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const howToSchema: WithContext<HowTo> = {
|
|
60
|
+
'@context': 'https://schema.org',
|
|
61
|
+
'@type': 'HowTo',
|
|
62
|
+
name: title,
|
|
63
|
+
step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const content: ToolLocaleContent<DamageFormulaLabUI> = {
|
|
67
|
+
slug,
|
|
68
|
+
title,
|
|
69
|
+
description,
|
|
70
|
+
ui: {
|
|
71
|
+
onboarding: 'Skriv din nuvarande skadeformel, placera ett alternativ bredvid och justera stridsvärdena.',
|
|
72
|
+
localNote: 'Privat modell. Formler och filer stannar i denna webbläsare.',
|
|
73
|
+
formulaDeck: 'Formelkammare',
|
|
74
|
+
formulaALabel: 'Formel A (Nuvarande modell)',
|
|
75
|
+
formulaBLabel: 'Formel B (Utmanare)',
|
|
76
|
+
formulaHint: 'Variabler: attack, defense, level, power, resistance, flat, criticalChance, criticalMultiplier',
|
|
77
|
+
formulaFunctions: 'Säkra funktioner: min, max, clamp, abs, sqrt, pow, floor, round, ceil',
|
|
78
|
+
presetLinear: 'Linjärt skydd',
|
|
79
|
+
presetRatio: 'Rustningsförhållande',
|
|
80
|
+
presetLevel: 'Nivåskalning',
|
|
81
|
+
combatInputs: 'Stridsvärden',
|
|
82
|
+
attackLabel: 'Attack',
|
|
83
|
+
defenseLabel: 'Försvar',
|
|
84
|
+
levelLabel: 'Nivå',
|
|
85
|
+
powerLabel: 'Kraftkoefficient',
|
|
86
|
+
resistanceLabel: 'Motstånd (%)',
|
|
87
|
+
flatLabel: 'Fast modifierare',
|
|
88
|
+
criticalChanceLabel: 'Kritisk chans (%)',
|
|
89
|
+
criticalMultiplierLabel: 'Kritisk multiplikator',
|
|
90
|
+
healthLabel: 'Målets hälsa',
|
|
91
|
+
cadenceLabel: 'Attacker per sekund',
|
|
92
|
+
roundingLabel: 'Skadeavrundning',
|
|
93
|
+
roundingNone: 'Behåll decimaler',
|
|
94
|
+
roundingFloor: 'Avrunda nedåt (Floor)',
|
|
95
|
+
roundingRound: 'Närmaste heltal',
|
|
96
|
+
roundingCeil: 'Avrunda uppåt (Ceil)',
|
|
97
|
+
orderLabel: 'Ordning för modifierare',
|
|
98
|
+
resistanceFirst: 'Motstånd sedan fast',
|
|
99
|
+
flatFirst: 'Fast sedan motstånd',
|
|
100
|
+
runLabel: 'Jämförelse i realtid',
|
|
101
|
+
resultDamage: 'Förväntad skada',
|
|
102
|
+
resultHits: 'Träffar för att besegra',
|
|
103
|
+
resultTtk: 'Time to Kill (TTK)',
|
|
104
|
+
resultDifference: 'Skadedifferens',
|
|
105
|
+
formulaAName: 'Nuvarande',
|
|
106
|
+
formulaBName: 'Utmanare',
|
|
107
|
+
curveTitle: 'Attackförloppskurva',
|
|
108
|
+
curveCaption: 'Attackvärdet varieras från hälften till det dubbla medan försvaret är fast.',
|
|
109
|
+
heatmapTitle: 'Heatmap för tryckfält',
|
|
110
|
+
heatmapCaption: 'Visar förväntad skada för Formel A över kombinationer av attack och försvar.',
|
|
111
|
+
attackAxis: 'Attack ökar åt höger',
|
|
112
|
+
defenseAxis: 'Försvar ökar nedåt',
|
|
113
|
+
scenariosTitle: 'Stridsprofiler',
|
|
114
|
+
scenarioSkirmisher: 'Skärmytslare',
|
|
115
|
+
scenarioGuardian: 'Väktare',
|
|
116
|
+
scenarioBoss: 'Boss',
|
|
117
|
+
scenarioCustom: 'Nuvarande inställning',
|
|
118
|
+
diagnosticsTitle: 'Tröskelkontroll',
|
|
119
|
+
statusBalanced: 'Inga avvikande matematiska hopp upptäcktes i detta testintervall.',
|
|
120
|
+
exportTitle: 'Exportera experimentet',
|
|
121
|
+
copyLink: 'Kopiera delningslänk',
|
|
122
|
+
exportCsv: 'Ladda ner CSV',
|
|
123
|
+
exportJson: 'Ladda ner JSON',
|
|
124
|
+
importJson: 'Importera JSON',
|
|
125
|
+
exportPng: 'Ladda ner PNG-diagram',
|
|
126
|
+
reset: 'Återställ modell',
|
|
127
|
+
privacyDisclosure: 'Delningslänken sparar konfigurationen i URL-hashen och skickar inte data till servrar.',
|
|
128
|
+
limitationDisclosure: 'Kritisk skada är ett genomsnitt och inte en slumpmässig simulering.',
|
|
129
|
+
importError: 'Filen är inte en giltig konfiguration.',
|
|
130
|
+
copiedStatus: 'Delningslänk kopierad till urklipp.',
|
|
131
|
+
},
|
|
132
|
+
seo: [
|
|
133
|
+
{
|
|
134
|
+
type: 'title',
|
|
135
|
+
level: 2,
|
|
136
|
+
text: 'Testa skadeformler för spel innan de implementeras',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
html: 'En skadeformel kan verka rimlig vid standardvärden men bryta samman vid höga nivåer. Detta laboratorium hjälper dig att upptäcka oönskade trösklar tidigt.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
level: 2,
|
|
145
|
+
text: 'Säker och begränsad matematisk utvärdering',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: 'Inmatningsfältet accepterar endast fördefinierade variabler och säkra funktioner utan att köra osäker kod.',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'table',
|
|
153
|
+
headers: ['Mätvärde', 'Beräkning', 'Designfråga'],
|
|
154
|
+
rows: [
|
|
155
|
+
['Förväntad skada', 'Basformel inklusive kritisk faktor och motstånd', 'Fungerar regeln rimligt för både svaga och starka enheter?'],
|
|
156
|
+
['Träffar för att besegra', 'Målets hälsa dividerat med avrundad skada', 'Gör 1 extra poäng att en hel träff faller bort?'],
|
|
157
|
+
['Time to Kill (TTK)', 'Intervall mellan träffar dividerat med attackhastighet', 'Skapar hastigheten den önskade stridsrytmen?'],
|
|
158
|
+
['Heatmap', 'Provtagning av Formel A över attack och försvar', 'Finns det oväntade trösklar eller döda zoner?'],
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'title',
|
|
163
|
+
level: 2,
|
|
164
|
+
text: 'Separera matematik från balansbeslut',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'paragraph',
|
|
168
|
+
html: 'En jämn graf garanterar inte att spelet är roligt. Använd laboratoriet för att hitta frågor att verifiera i speltester.',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: 'tip',
|
|
172
|
+
title: 'Granska skada och antal träffar tillsammans',
|
|
173
|
+
html: 'En liten förändring i skada kan passera en hälsotröskel och minska antal träffar med en hel attack. Jämför alltid skada med TTK.',
|
|
174
|
+
},
|
|
175
|
+
{ type: 'paragraph', html: 'Samma formel kan ge ett annat stridsresultat beroende på avrundning och modifierarnas ordning. Kontrollera även låg skada, högt försvar och tröskeln för en extra träff; TTK modellerar inte undvikanden, cooldowns eller avbrott.' },
|
|
176
|
+
{ type: 'paragraph', html: 'Spara flera kontrollscenarier efter varje ändring: svag attack mot högt försvar, kritisk träff och gränsen där antalet träffar ändras. Dessa exempel gör det lättare att jämföra balansversioner och upptäcka regressioner efter att koefficienter eller avrundningsregler har ändrats.' },
|
|
177
|
+
],
|
|
178
|
+
faq,
|
|
179
|
+
bibliographyTitle: 'Referenser för skadeberäkning i spel',
|
|
180
|
+
bibliography: bibliographyEntries,
|
|
181
|
+
howTo,
|
|
182
|
+
schemas: [softwareApplication, faqPage, howToSchema],
|
|
183
|
+
};
|