Etapa 1 inteira (logica com 100% de cobertura, cena 3D, toque, sons, bancada de desempenho, e2e) e a base da etapa 2 (mapa novo no Tiled, texturas, imagens dos itens, sons conferidos, golpe recortado e medido). Pagina /jogo fora do menu e do sitemap ate a medicao no celular.
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
export type Credito = {
|
|
arquivo: string;
|
|
origem: string;
|
|
autor: string;
|
|
licenca: string;
|
|
};
|
|
|
|
export const LICENCAS_ACEITAS = ["CC0-1.0", "propria"] as const;
|
|
|
|
function errosDoCredito({
|
|
arquivo,
|
|
origem,
|
|
autor,
|
|
licenca,
|
|
}: Credito): string[] {
|
|
const erros: string[] = [];
|
|
if (!(LICENCAS_ACEITAS as readonly string[]).includes(licenca)) {
|
|
erros.push(`${arquivo}: licença não aceita (${licenca}).`);
|
|
}
|
|
if (licenca === "CC0-1.0" && !origem.startsWith("https://")) {
|
|
erros.push(`${arquivo}: a origem de CC0-1.0 deve começar com https://.`);
|
|
}
|
|
if (autor.trim() === "") erros.push(`${arquivo}: autor vazio.`);
|
|
return erros;
|
|
}
|
|
|
|
export function validarCreditos(
|
|
arquivos: string[],
|
|
creditos: Credito[],
|
|
): string[] {
|
|
const erros: string[] = [];
|
|
const vistos = new Set<string>();
|
|
for (const credito of creditos) {
|
|
if (vistos.has(credito.arquivo))
|
|
erros.push(`${credito.arquivo}: creditado mais de uma vez.`);
|
|
vistos.add(credito.arquivo);
|
|
if (!arquivos.includes(credito.arquivo))
|
|
erros.push(`${credito.arquivo}: crédito de arquivo que não existe.`);
|
|
erros.push(...errosDoCredito(credito));
|
|
}
|
|
for (const arquivo of arquivos) {
|
|
if (!vistos.has(arquivo)) erros.push(`${arquivo}: arquivo sem crédito.`);
|
|
}
|
|
return erros;
|
|
}
|