Dla twórców · schemaVersion 1.1.0
Format paczki sprawy
Każda sprawa to jedno archiwum ZIP z rozszerzeniem .case.zip. Zawiera dane i multimedia — nigdy kod. Ten sam format zapisuje edytor, importer i eksport.
Struktura
moja-sprawa.case.zip ├── manifest.json treści widoczne dla gracza + konfiguracja gry ├── solution.json klucz odpowiedzi, punktacja, wyjaśnienie (prywatne) ├── README.md opcjonalny opis dla moderatora └── assets/ obrazy, audio, wideo, szkice, PDF
Pliki mogą leżeć w katalogu głównym archiwum albo w jednym katalogu nadrzędnym (np. gdy spakujesz cały folder). Ścieżki w manifeście są względne względem paczki, np. assets/evidence/photo-01.jpg.
Jak wgrać sprawę
- Przygotuj katalog z plikami jak wyżej (zacznij od manifest.template.json i solution.template.json).
- Spakuj go do ZIP i zmień rozszerzenie na
.case.zip. - W zakładce Stwórz sprawę przeciągnij plik na pole uploadu. Walidator od razu pokaże raport: błędy blokujące i ostrzeżenia z nazwą pliku i ścieżką pola (np.
manifest.json › evidence[3].blocks[1].assetId). - Uruchom Podgląd i test — rozegrasz sprawę w tym samym odtwarzaczu, co gracze.
- Wyślij do moderacji. Po akceptacji sprawa trafia do katalogu jako niezmienna wersja; kolejne zmiany tworzą nową wersję.
Chcesz tylko sprawdzić paczkę? Użyj pola Tylko sprawdź paczkę — nic nie zostanie zapisane. Lokalnie: node tools/validate-case.js moja-sprawa.case.zip.
manifest.json
| Sekcja | Zawartość |
|---|---|
metadata | id, slug (a–z, 0–9, myślniki), tytuł, opis bez spoilerów, język, trudność 1–5, durationMinutes {min,max}, players {min,max}, tagi, ostrzeżenia treści, coverAssetId, opcjonalnie numer sprawy, miejsce, data, autor. |
gameplay | blokada akt i jej komunikat, limit wskazówek, polecane dowody na starcie, grupy filtrów dowodów. |
briefing | ekran startowy (intro), okładka briefingu, zadanie i kroki, karta sprawy, podpowiedzi w notatniku, dodatkowe bloki. |
suspects[] | id, imię, rola, portret (portraitAssetId), opis, motyw, zeznanie, alibi {status, text} — status: confirmed, partial, unconfirmed, none. |
assets[] | rejestr plików: id, typ (image, sketch, audio, video, document), ścieżka, MIME, opis alternatywny, podpis, autorstwo/licencja, czas trwania, transkrypcja, fictional dla portretów. |
evidence[] | id, numer, tytuł, kategoria, grupa, podsumowanie, data/czas, miniatura i uporządkowana lista bloków. Bez oceny znaczenia dowodu. |
timeline[] | zdarzenia z czasem, opisem i evidenceIds, z których da się je odtworzyć. |
verdict.questions[] | pytania single/multiple; źródło opcji: suspects (automatycznie z podejrzanych), evidence (dowody) lub options (własne). Bez poprawnych odpowiedzi. |
hints[] | poziom i tekst — gracz widzi je dopiero po odsłonięciu (serwer wydaje je pojedynczo). |
Bloki treści
Dokumenty składają się z bloków w dowolnej kolejności i liczbie. Tekst nie może zawierać HTML — dozwolone są **pogrubienie**, *kursywa*, ==wyróżnienie== i nowe linie \n.
| Typ | Pola |
|---|---|
paragraph | text |
heading | text, level 2 lub 3 |
quote | text, cite |
list | items[], ordered |
callout | text, title, tone (note, info, warning) |
stamp | text — pieczątka |
table | columns[], rows[][] |
image | assetId, alt, caption |
gallery | items[{assetId, alt, caption}] |
audio | assetId, caption, transcript (tekst lub [{speaker, time, text}]) |
video | assetId, posterAssetId, caption, transcript |
transcript | title, lines[{speaker, time, text}] lub text |
document | assetId (PDF), title, caption — bezpieczny podgląd ze stronicowaniem i powiększeniem |
sketch | assetId, alt, caption, markers[{x, y, label, description}] — współrzędne 0–1 |
solution.json
Prywatna część sprawy — serwer przechowuje ją osobno i nigdy nie wysyła graczowi przed werdyktem.
answerKey | poprawna odpowiedź dla każdego pytania: {"culprit": "marta", "evidence": ["access", "photo-check"]} |
scoring | maxScore, hintPenalty, solvedRequires[], punkty za pytania; dla pytań wielokrotnego wyboru mode: atLeast (z min), exact lub proportional. |
reasoningChain[] | wnioski {claim, evidenceIds} — każdy oparty na co najmniej dwóch dowodach. |
truthTimeline[] | opcjonalnie: faktyczny przebieg zdarzeń {time, fact}. |
explanation[] | wyjaśnienie końcowe jako bloki treści. |
Pliki i limity
| Typ | Formaty | Limit |
|---|---|---|
| image, sketch | JPG, PNG, WebP | 15 MB |
| audio | MP3, M4A, OGG | 30 MB |
| video | MP4, WebM | 100 MB |
| document | PDF (bez skryptów i załączników) | 25 MB |
| cała paczka | ZIP | 250 MB |
Typ pliku sprawdzamy po zawartości, nie po nazwie. Zdjęcia są ponownie kodowane, a metadane EXIF (w tym GPS) usuwane. Odrzucamy SVG, HTML, skrypty, archiwa w archiwum i ścieżki wychodzące poza paczkę (../).
Walidacja
Błędy blokujące
- brak lub nieobsługiwane
schemaVersion, uszkodzony ZIP, niepoprawny JSON; - brak metadanych, pytań werdyktu, rozwiązania lub wyjaśnienia;
- mniej niż 2 podejrzanych lub 5 dowodów;
- powtórzone identyfikatory, odwołania do nieistniejących podejrzanych, dowodów, zasobów, pytań lub opcji;
- brakujący plik, niedozwolony typ, przekroczony limit, niezgodna zawartość pliku;
- HTML, skrypty, iframe albo poprawne odpowiedzi w manifeście publicznym;
- nieznany typ bloku.
Ostrzeżenia
- wniosek oparty na jednym dowodzie, zdarzenie bez źródła, zdarzenia w złej kolejności;
- podejrzany bez alibi lub nierozróżnialne alibi;
- obraz bez opisu alternatywnego lub podpisu, nagranie bez transkrypcji, bardzo duży plik, dane GPS;
- możliwy spoiler w tytule, opisie lub tagach; nieużywane zasoby.