Skip to content

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ę:

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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 klasy

3. 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:

python
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 activities

Tracking i Analytics

Dla Każdej Aktywności

System śledzi:

json
{
  "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

AspektSzczegóły
FormatJSON-based mini-aplikacje
TypyQuiz, Video, Audio, Minigame, Creative, Reading, Story, Coding
TwórcyAdmin, Nauczyciele, Rodzice
VisibilityPublic, Group, Private
RewardsLumoCoins + XP + Achievements
FiltrowanieWiek, Świat, Visibility, Ukończone
AnalyticsCompletion 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.

Lumos Islands - Educational Game Design Documentation