Zadania i Aktywności - Activity System
Koncepcja Activity
Activity (aktywność) to jednostka treści edukacyjnej w Lumos Islands. Każda aktywność to mini-aplikacja zapisana jako JSON, którą można łatwo dodawać, modyfikować i przypisywać do lokacji.
Kluczowe Zasady
- 📄 JSON-based - wszystkie aktywności to pliki JSON
- 🔌 Plug & Play - łatwo dodawać nowe aktywności
- 👥 Multi-creator - tworzone przez admin, nauczycieli, rodziców
- 🌍 Multi-world - mogą być przypisane do wielu światów
- 🎯 Age-appropriate - filtrowane według wieku
Typy Aktywności
1. Quiz
Pytania wielokrotnego wyboru
Use case: Sprawdzanie wiedzy po filmie, po materiale, standalone
2. Video
Film edukacyjny + quiz
Use case: Nauka przez oglądanie
3. Audio
Podcast, bajka słuchowiskowa + quiz
Use case: Nauka przez słuchanie
4. Minigame
Interaktywna gra edukacyjna
Use case: Nauka przez zabawę
5. Creative Task
Zadanie kreatywne (rysowanie, pisanie, budowanie)
Use case: Rozwijanie kreatywności
6. Reading
Czytanie tekstu/książki + quiz
Use case: Czytanie ze zrozumieniem
7. Interactive Story
Interaktywna historia z wyborami
Use case: Decision-making, storytelling
8. Coding Challenge
Zadanie programistyczne (blokowe)
Use case: Nauka programowania
Struktura JSON - Activity Asset
Base Activity Schema
Każda aktywność ma wspólną bazową strukturę:
{
"activity_id": "activity_12345",
"version": "1.0",
"created_at": "2026-01-11T10:00:00Z",
"updated_at": "2026-01-11T10:00:00Z",
"metadata": {
"title": "Dinozaury - Władcy Prehistorii",
"description": "Poznaj fascynujący świat dinozaurów!",
"language": "pl",
"subject": "science", // mathematics, science, language, history, etc.
"age_range": [4, 8], // min 4 lata, max 8 lat
"estimated_time": 10, // minutes
"difficulty": "medium", // easy, medium, hard
"tags": ["dinosaurs", "prehistory", "animals"]
},
"creator": {
"type": "admin", // admin, teacher, parent
"user_id": "admin_001",
"name": "Lumos Islands Team"
},
"availability": {
"worlds": ["world_4-8", "world_science"], // które światy
"locations": ["cinema"], // które lokacje w mieście
"visibility": "public" // public, private, group
},
"rewards": {
"lumo_coins": 25,
"xp": {
"science": 10
},
"achievements": ["first_video"] // opcjonalnie unlock achievement
},
"type": "video", // quiz, video, audio, minigame, creative, reading, story, coding
"content": {
// Specyficzne dla typu (poniżej)
}
}Typ 1: Quiz
JSON Structure
{
"activity_id": "quiz_math_001",
"type": "quiz",
"metadata": {
"title": "Tabliczka Mnożenia - Test",
"description": "Sprawdź swoją znajomość tabliczki mnożenia do 10",
"subject": "mathematics",
"age_range": [6, 10],
"estimated_time": 5,
"difficulty": "medium"
},
"rewards": {
"lumo_coins": 20,
"xp": {"mathematics": 15}
},
"content": {
"quiz_type": "multiple_choice", // multiple_choice, true_false, fill_in_blank
"passing_score": 80, // % do zaliczenia
"randomize_questions": true,
"randomize_answers": true,
"show_correct_answers": true, // po zakończeniu
"time_limit": null, // null = bez limitu, lub sekundy
"questions": [
{
"question_id": "q1",
"question_text": "Ile to jest 7 × 8?",
"question_image": null, // opcjonalnie URL do obrazka
"answers": [
{"id": "a", "text": "54", "correct": false},
{"id": "b", "text": "56", "correct": true},
{"id": "c", "text": "58", "correct": false},
{"id": "d", "text": "64", "correct": false}
],
"explanation": "7 × 8 = 56. Możesz to policzyć jako 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7!"
},
{
"question_id": "q2",
"question_text": "Ile to jest 9 × 6?",
"answers": [
{"id": "a", "text": "54", "correct": true},
{"id": "b", "text": "56", "correct": false},
{"id": "c", "text": "63", "correct": false},
{"id": "d", "text": "72", "correct": false}
],
"explanation": "9 × 6 = 54"
}
// ... więcej pytań
]
}
}Typ 2: Video
JSON Structure
{
"activity_id": "video_dino_001",
"type": "video",
"metadata": {
"title": "Dinozaury - Władcy Prehistorii",
"description": "Poznaj fascynujący świat dinozaurów!",
"subject": "science",
"age_range": [4, 8],
"estimated_time": 10
},
"rewards": {
"lumo_coins": 25,
"xp": {"science": 10}
},
"content": {
"video": {
"url": "https://storage.lumosislands.com/videos/dino_001.mp4",
"duration": 480, // seconds (8 min)
"thumbnail": "https://storage.lumosislands.com/videos/dino_001_thumb.jpg",
"subtitles": {
"pl": "https://storage.lumosislands.com/videos/dino_001_pl.vtt",
"en": "https://storage.lumosislands.com/videos/dino_001_en.vtt"
},
"allow_skip": false, // czy można pominąć?
"track_progress": true // czy śledzić postęp (min 80% obejrzane)
},
"post_video_quiz": {
"required": true,
"passing_score": 60,
"questions": [
{
"question_id": "q1",
"question_text": "Który dinozaur był największy?",
"answers": [
{"id": "a", "text": "T-Rex", "correct": false},
{"id": "b", "text": "Argentinosaurus", "correct": true},
{"id": "c", "text": "Velociraptor", "correct": false}
]
},
{
"question_id": "q2",
"question_text": "Czym żywił się T-Rex?",
"answers": [
{"id": "a", "text": "Roślinami", "correct": false},
{"id": "b", "text": "Mięsem", "correct": true},
{"id": "c", "text": "Rybami", "correct": false}
]
}
]
}
}
}Typ 3: Audio
JSON Structure
{
"activity_id": "audio_podcast_001",
"type": "audio",
"metadata": {
"title": "Dlaczego Niebo Jest Niebieskie?",
"description": "Podcast o rozpraszaniu światła",
"subject": "science",
"age_range": [6, 10],
"estimated_time": 5
},
"rewards": {
"lumo_coins": 15,
"xp": {"science": 8}
},
"content": {
"audio": {
"url": "https://storage.lumosislands.com/audio/podcast_001.mp3",
"duration": 300, // 5 min
"thumbnail": "https://storage.lumosislands.com/audio/podcast_001_thumb.jpg",
"transcript": "https://storage.lumosislands.com/audio/podcast_001_transcript.txt",
"allow_skip": false,
"track_progress": true
},
"post_audio_quiz": {
"required": true,
"passing_score": 70,
"questions": [
{
"question_id": "q1",
"question_text": "Dlaczego niebo jest niebieskie?",
"question_type": "multiple_choice",
"answers": [
{"id": "a", "text": "Bo odbija kolor oceanu", "correct": false},
{"id": "b", "text": "Bo niebieskie światło rozprasza się bardziej", "correct": true},
{"id": "c", "text": "Bo tak stworzył Bóg", "correct": false}
]
}
]
}
}
}Typ 4: Minigame
JSON Structure
{
"activity_id": "minigame_memory_001",
"type": "minigame",
"metadata": {
"title": "Memory - Zwierzęta",
"description": "Znajdź pary zwierząt!",
"subject": "memory",
"age_range": [3, 6],
"estimated_time": 3
},
"rewards": {
"lumo_coins": 10,
"xp": {"cognitive": 5}
},
"content": {
"minigame_type": "memory", // memory, puzzle, math_race, etc.
"config": {
"grid_size": "4x4", // 16 kart (8 par)
"time_limit": null,
"max_attempts": null,
"cards": [
{"id": 1, "image": "https://.../animals/cat.png", "pair_id": "cat"},
{"id": 2, "image": "https://.../animals/cat.png", "pair_id": "cat"},
{"id": 3, "image": "https://.../animals/dog.png", "pair_id": "dog"},
{"id": 4, "image": "https://.../animals/dog.png", "pair_id": "dog"},
// ... 8 więcej
]
},
"scoring": {
"base_reward": 10, // bazowe LC
"time_bonus": {
"under_30s": 5,
"under_60s": 3
},
"accuracy_bonus": {
"no_mistakes": 5
}
}
}
}Typ 5: Creative Task
JSON Structure
{
"activity_id": "creative_drawing_001",
"type": "creative",
"metadata": {
"title": "Narysuj Swojego Przyjaciela",
"description": "Użyj narzędzi do rysowania",
"subject": "art",
"age_range": [4, 10],
"estimated_time": 10
},
"rewards": {
"lumo_coins": 20,
"xp": {"creativity": 15}
},
"content": {
"creative_type": "drawing", // drawing, writing, building
"drawing": {
"canvas_size": [800, 600],
"tools": ["pencil", "brush", "eraser", "color_picker"],
"colors": "full_palette",
"background": "white"
},
"prompt": "Narysuj swojego najlepszego przyjaciela. Pokaż co lubicie robić razem!",
"submission": {
"requires_approval": true, // rodzic/nauczyciel musi zatwierdzić
"approver": "parent", // parent, teacher, auto
"min_time_spent": 60 // min 60s aby zapobiec spam
},
"rubric": {
// Dla rodzica/nauczyciela - jak ocenić
"criteria": [
"Effort (wysiłek)",
"Creativity (kreatywność)",
"Following prompt (zgodność z poleceniem)"
],
"bonus_reward_range": [0, 20] // rodzic może dać +0 do +20 LC
}
}
}Typ 6: Reading
JSON Structure
{
"activity_id": "reading_story_001",
"type": "reading",
"metadata": {
"title": "Przygoda w Zaczarowanym Lesie",
"description": "Przeczytaj krótką bajkę",
"subject": "language",
"age_range": [6, 9],
"estimated_time": 8
},
"rewards": {
"lumo_coins": 15,
"xp": {"language": 10}
},
"content": {
"story": {
"format": "rich_text", // rich_text, markdown, html
"text": "Dawno, dawno temu w zaczarowanym lesie...\n\n[Pełny tekst historii]",
"images": [
{"page": 1, "url": "https://.../story_001_page1.jpg"},
{"page": 2, "url": "https://.../story_001_page2.jpg"}
],
"audio_narration": "https://.../story_001_narration.mp3", // opcjonalnie
"pages": 5,
"words_count": 300
},
"comprehension_quiz": {
"required": true,
"passing_score": 70,
"questions": [
{
"question_id": "q1",
"question_text": "Jak miała na imię główna bohaterka?",
"answers": [
{"id": "a", "text": "Ania", "correct": true},
{"id": "b", "text": "Zosia", "correct": false},
{"id": "c", "text": "Kasia", "correct": false}
]
}
]
}
}
}Typ 7: Interactive Story
JSON Structure
{
"activity_id": "story_interactive_001",
"type": "interactive_story",
"metadata": {
"title": "Tajemnica Starego Zamku",
"description": "Twoje wybory kształtują historię!",
"subject": "language",
"age_range": [8, 13],
"estimated_time": 12
},
"rewards": {
"lumo_coins": 30,
"xp": {"language": 20, "critical_thinking": 10}
},
"content": {
"story_nodes": [
{
"node_id": "start",
"text": "Stoisz przed starym zamkiem. Drzwi są uchylone. Co robisz?",
"image": "https://.../castle_entrance.jpg",
"choices": [
{
"choice_id": "enter",
"text": "Wchodzę do środka",
"next_node": "inside_hall"
},
{
"choice_id": "explore",
"text": "Najpierw obchodzę zamek dookoła",
"next_node": "around_castle"
}
]
},
{
"node_id": "inside_hall",
"text": "Wchodzisz do wielkiej sali. Na środku leży stary klucz...",
"image": "https://.../hall.jpg",
"choices": [
{"choice_id": "take_key", "text": "Biorę klucz", "next_node": "with_key"},
{"choice_id": "leave_key", "text": "Zostawiam klucz", "next_node": "no_key"}
]
}
// ... więcej nodes
],
"endings": [
{
"node_id": "good_ending",
"text": "Gratulacje! Uratowałeś królestwo!",
"bonus_reward": 10
},
{
"node_id": "bad_ending",
"text": "Niestety, nie udało się...",
"bonus_reward": 0
}
]
}
}Typ 8: Coding Challenge
JSON Structure
{
"activity_id": "coding_challenge_001",
"type": "coding",
"metadata": {
"title": "Robot Zbieracz - Podstawy",
"description": "Zaprogramuj robota żeby zebrał wszystkie monety",
"subject": "programming",
"age_range": [8, 13],
"estimated_time": 10
},
"rewards": {
"lumo_coins": 40,
"xp": {"programming": 25}
},
"content": {
"coding_type": "block", // block (Scratch-like) or text
"initial_state": {
"grid_size": [5, 5],
"robot_position": [0, 0],
"robot_direction": "east",
"coins_positions": [[2, 2], [4, 4], [1, 3]],
"obstacles": [[2, 1], [3, 2]]
},
"goal": "Zbierz wszystkie 3 monety",
"available_blocks": [
{"type": "move", "label": "Idź do przodu", "icon": "→"},
{"type": "turn_left", "label": "Skręć w lewo", "icon": "↺"},
{"type": "turn_right", "label": "Skręć w prawo", "icon": "↻"},
{"type": "collect", "label": "Zbierz monetę", "icon": "💰"},
{"type": "loop", "label": "Powtórz X razy", "icon": "🔁"}
],
"hints": [
"Użyj pętli aby uniknąć powtarzania kodu",
"Pamiętaj aby zebrać monetę gdy dojdziesz do niej"
],
"solution_validation": {
"type": "simulation", // symulacja wykonania kodu
"success_criteria": "all_coins_collected"
}
}
}System Tworzenia Aktywności
Kto Może Tworzyć?
1. Administrator (Lumos Team)
- Pełen dostęp - może tworzyć wszystkie typy
- Visibility: public (wszyscy gracze)
- Quality control: tak
Przykład:
- Oficjalne quizy matematyczne
- Filmy edukacyjne licencjonowane
- Minigry stworzone przez zespół
2. Nauczyciel
- Dostęp: quiz, creative, reading
- Visibility: group (tylko jego klasa) lub public (za zgodą admina)
- Quality control: pierwszy content musi być zatwierdzony przez admina
Przykład:
- Pani Kowalska tworzy quiz "Tabliczka mnożenia" dla swojej klasy 3A
- Quiz jest widoczny tylko dla dzieci z klasy 3A
- Po zatwierdzeniu przez admina, może być public
Workflow:
Nauczyciel tworzy quiz w Web App
↓
Status: DRAFT
↓
Klikaotwierz "Submit for Review"
↓
Admin dostaje notyfikację
↓
Admin sprawdza i zatwierdza
↓
Status: ACTIVE → widoczne dla klasy3. Rodzic
- Dostęp: quiz, creative (ograniczone)
- Visibility: private (tylko jego dziecko)
- Quality control: nie (tylko dla własnego dziecka)
Przykład:
- Mama tworzy quiz "Stolice Europy" dla 8-letniej Ani
- Quiz jest widoczny tylko dla Ani
- Ani widzi go w Bibliotece jako "Zadanie od Mamy"
Web App - Activity Creator
Dla Nauczycieli/Rodziców:
╔════════════════════════════════════════════════╗
║ Activity Creator - Stwórz Nowe Zadanie ║
╚════════════════════════════════════════════════╝
Krok 1: Wybierz Typ
[ Quiz ] [ Zadanie Kreatywne ] [ Czytanie ]
Krok 2: Podstawowe Informacje
Tytuł: [ ]
Opis: [ ]
Przedmiot: [Matematyka ▼]
Wiek: Od [6] do [10] lat
Czas: [5] minut
Krok 3: Treść (dla Quiz)
Pytanie 1:
[Ile to 2 + 2?]
Odpowiedzi:
○ [3] ☐ Poprawna
○ [4] ☑ Poprawna
○ [5] ☐ Poprawna
[+ Dodaj Pytanie]
Krok 4: Nagrody
LumoCoins: [20]
XP (Matematyka): [10]
Krok 5: Przypisanie
Kto może zobaczyć?
○ Tylko moje dziecko (Anna)
○ Cała moja klasa (3A)
○ Publiczne (wymaga zatwierdzenia)
[Zapisz jako Draft] [Opublikuj]Filtrowanie i Przypisywanie
Automatyczne Filtrowanie
System automatycznie filtruje aktywności dla dziecka:
def get_available_activities(child):
activities = []
for activity in all_activities:
# Filtr 1: Wiek
if child.age not in activity.age_range:
continue
# Filtr 2: Świat
if child.current_world not in activity.worlds:
continue
# Filtr 3: Visibility
if activity.visibility == "private":
if activity.creator.child_id != child.id:
continue
if activity.visibility == "group":
if child.group_id not in activity.groups:
continue
# Filtr 4: Ukończone (opcjonalnie ukryj)
if activity.id in child.completed_activities:
if not activity.repeatable:
continue
activities.append(activity)
return activitiesTracking i Analytics
Dla Każdej Aktywności
System śledzi:
{
"activity_completion": {
"activity_id": "quiz_math_001",
"child_id": "child_456",
"started_at": "2026-01-11T10:00:00Z",
"completed_at": "2026-01-11T10:05:30Z",
"time_spent": 330, // seconds
"results": {
"score": 90, // %
"questions_total": 10,
"questions_correct": 9,
"attempts": 1
},
"rewards_earned": {
"lumo_coins": 20,
"xp": {"mathematics": 15},
"achievements": ["first_quiz"]
}
}
}Dashboard dla Rodziców/Nauczycieli
╔════════════════════════════════════════════════╗
║ Analytics - Quiz "Tabliczka Mnożenia" ║
╚════════════════════════════════════════════════╝
Ukończenia: 25 / 30 dzieci (83%)
Średni wynik: 85%
Najwyższy wynik: 100% (5 dzieci)
Najniższy wynik: 60% (1 dziecko)
Średni czas: 4 min 30s
Najtrudniejsze pytanie:
"Ile to 7 × 8?" - 40% poprawnych odpowiedzi
→ Sugestia: Dzieci mają problem z tą częścią tabliczki
[Zobacz Szczegóły] [Edytuj Quiz] [Eksportuj Raport]Storage i Delivery
Gdzie Przechowywać?
Aktywności (JSON):
- Database (MongoDB, PostgreSQL z JSONB)
- Dla małych aktywności: bezpośrednio w DB
- Dla dużych: file storage (S3) + metadata w DB
Media (wideo, audio, obrazki):
- CDN (CloudFront, Cloudflare)
- S3 / Cloud Storage
- Optymalizacja: różne rozdzielczości dla różnych urządzeń
Podsumowanie
| Aspekt | Szczegóły |
|---|---|
| Format | JSON-based mini-aplikacje |
| Typy | Quiz, Video, Audio, Minigame, Creative, Reading, Story, Coding |
| Twórcy | Admin, Nauczyciele, Rodzice |
| Visibility | Public, Group, Private |
| Rewards | LumoCoins + XP + Achievements |
| Filtrowanie | Wiek, Świat, Visibility, Ukończone |
| Analytics | Completion rate, Score, Time, Trudność pytań |
System aktywności jest modularny, skalowalny i łatwy w zarządzaniu, umożliwiając tworzenie nieograniczonej ilości treści edukacyjnych przez społeczność (nauczycieli, rodziców) przy zachowaniu kontroli jakości.