Reduce game sizes and fix Mario level display
- Reduce RiverRun game height from 100vh to 75vh for better screen fit - Reduce AdventureReader game height from 100vh to 75vh - Fix Mario level number display (was showing currentLevel + 1 twice) - Updated HUD level display in Renderer.js - Updated finish line flag level display in Renderer.js - Add portable setup files and documentation - Add new game modules: SentenceInvaders, ThematicQuestions - Add new content: wte2 book, sbs chapters 2-3, wte2-2 chapter - Update various game modules for improved compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
e4d7e838d5
commit
ab84bbbc71
3
.gitignore
vendored
3
.gitignore
vendored
@ -4,6 +4,9 @@ npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Portable Node.js (for USB deployment)
|
||||
nodejs-portable/
|
||||
|
||||
# Build outputs
|
||||
dist/
|
||||
build/
|
||||
|
||||
122
00_COMMENCE_ICI.txt
Normal file
122
00_COMMENCE_ICI.txt
Normal file
@ -0,0 +1,122 @@
|
||||
|
||||
╔═══════════════════════════════════════════════════════════════╗
|
||||
║ ║
|
||||
║ CLASS GENERATOR 2.0 - VERSION PORTABLE ║
|
||||
║ ║
|
||||
║ 👉 COMMENCE PAR LIRE CE FICHIER 👈 ║
|
||||
║ ║
|
||||
╚═══════════════════════════════════════════════════════════════╝
|
||||
|
||||
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ 🎯 TU VEUX L'UTILISER EN COURS DEMAIN? │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
|
||||
📋 ÉTAPES À SUIVRE MAINTENANT (5 minutes):
|
||||
|
||||
1️⃣ Double-clic sur: DOWNLOAD_NODEJS.bat
|
||||
→ Télécharge Node.js portable
|
||||
|
||||
2️⃣ Double-clic sur: CHECKLIST_USB.txt
|
||||
→ Checklist complète pour préparer ta clé USB
|
||||
|
||||
3️⃣ Tester avec: START_PORTABLE.bat
|
||||
→ Vérifie que ça marche avant demain!
|
||||
|
||||
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ 📚 DOCUMENTATION DISPONIBLE │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
|
||||
Pour débutants (FRANÇAIS):
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
📄 LISEZMOI.txt → Guide rapide en français
|
||||
📋 CHECKLIST_USB.txt → Étapes de préparation
|
||||
⚡ QUICK_START.txt → Démarrage rapide
|
||||
|
||||
Pour avancés (DÉTAILLÉ):
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
📖 PORTABLE_SETUP.txt → Setup détaillé
|
||||
📚 README_PORTABLE.md → Documentation complète (Markdown)
|
||||
📝 README.md → Documentation générale du projet
|
||||
|
||||
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ 🚀 FICHIERS DE LANCEMENT │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
|
||||
Version Portable (pour clé USB):
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
🎯 START_PORTABLE.bat → UTILISE CELUI-CI en cours!
|
||||
📥 DOWNLOAD_NODEJS.bat → Télécharge Node.js portable
|
||||
|
||||
Version Standard (si Node.js installé):
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
▶️ start.bat → Version classique (ton PC)
|
||||
|
||||
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ 💡 QUELLE VERSION UTILISER? │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
|
||||
📍 Sur TON PC (Node.js installé):
|
||||
→ Utilise: start.bat
|
||||
→ Ou commande: npm start
|
||||
|
||||
📍 En COURS / CLÉ USB (pas de Node.js):
|
||||
→ Utilise: START_PORTABLE.bat
|
||||
→ Prépare d'abord avec: DOWNLOAD_NODEJS.bat
|
||||
|
||||
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ ⚠️ RAPPELS IMPORTANTS │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
|
||||
✅ Fonctionne SANS internet en cours
|
||||
✅ Fonctionne SANS installation (droits admin)
|
||||
✅ Fonctionne depuis une CLÉ USB
|
||||
|
||||
❌ AI ne marche PAS sans internet (normal!)
|
||||
❌ Besoin de Windows 10 minimum
|
||||
❌ Besoin de ~150 MB sur la clé USB
|
||||
|
||||
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ 🎓 DEMAIN EN COURS (Procédure rapide) │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
|
||||
1. Brancher la clé USB
|
||||
2. Aller dans le dossier Class_Generator
|
||||
3. Double-clic: START_PORTABLE.bat
|
||||
4. Attendre 10 secondes
|
||||
5. Ouvrir Chrome: http://localhost:8080
|
||||
6. ✅ Ça marche!
|
||||
|
||||
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ 🆘 BESOIN D'AIDE? │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
|
||||
Lis dans cet ordre:
|
||||
1. LISEZMOI.txt (français, simple)
|
||||
2. CHECKLIST_USB.txt (préparation USB)
|
||||
3. PORTABLE_SETUP.txt (détails techniques)
|
||||
|
||||
Problème? Voir section "Dépannage" dans PORTABLE_SETUP.txt
|
||||
|
||||
|
||||
╔═══════════════════════════════════════════════════════════════╗
|
||||
║ ║
|
||||
║ 🚀 PRÊT À COMMENCER? ║
|
||||
║ ║
|
||||
║ 👉 Double-clic sur: DOWNLOAD_NODEJS.bat ║
|
||||
║ 👉 Puis lis: CHECKLIST_USB.txt ║
|
||||
║ ║
|
||||
║ Bonne chance pour demain! 🎓 ║
|
||||
║ ║
|
||||
╚═══════════════════════════════════════════════════════════════╝
|
||||
|
||||
|
||||
────────────────────────────────────────────────────────────────
|
||||
Version: 2.0 Portable | Créé le: 2025-10-18 | Pour: Cours
|
||||
────────────────────────────────────────────────────────────────
|
||||
163
CHECKLIST_USB.txt
Normal file
163
CHECKLIST_USB.txt
Normal file
@ -0,0 +1,163 @@
|
||||
═══════════════════════════════════════════════════════════════
|
||||
CHECKLIST - PRÉPARATION CLÉ USB POUR DEMAIN
|
||||
═══════════════════════════════════════════════════════════════
|
||||
|
||||
🎯 OBJECTIF: Utiliser Class Generator sur le PC de cours (Windows 10)
|
||||
|
||||
📋 ÉTAPES À FAIRE CE SOIR (sur ton PC)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
☐ 1. TÉLÉCHARGER NODE.JS PORTABLE
|
||||
• Double-clic: DOWNLOAD_NODEJS.bat
|
||||
• Télécharger: "Windows Binary (.zip)" - LTS
|
||||
• Extraire le fichier ZIP
|
||||
• Renommer le dossier en: nodejs-portable
|
||||
• Copier dans: Class_generator/
|
||||
|
||||
Vérification:
|
||||
✓ Le fichier Class_generator/nodejs-portable/node.exe existe?
|
||||
|
||||
☐ 2. TESTER EN LOCAL (important!)
|
||||
• Double-clic: START_PORTABLE.bat
|
||||
• Vérifier que ça démarre sans erreur
|
||||
• Ouvrir: http://localhost:8080
|
||||
• Tester la navigation
|
||||
• Fermer le serveur (Ctrl+C)
|
||||
|
||||
Vérification:
|
||||
✓ L'application s'ouvre dans le navigateur?
|
||||
✓ Pas d'erreurs dans la console?
|
||||
|
||||
☐ 3. PRÉPARER LA CLÉ USB
|
||||
• Brancher ta clé USB
|
||||
• Vérifier l'espace libre: minimum 150 MB
|
||||
• Créer un dossier: "Class_Generator" (optionnel)
|
||||
• Copier TOUT le dossier sur la clé
|
||||
|
||||
Vérification:
|
||||
✓ Taille copiée: ~95-100 MB?
|
||||
✓ Le fichier START_PORTABLE.bat est sur la clé?
|
||||
✓ Le dossier nodejs-portable/ est sur la clé?
|
||||
|
||||
☐ 4. TESTER DEPUIS LA CLÉ USB (important!)
|
||||
• Aller dans le dossier sur la clé USB
|
||||
• Double-clic: START_PORTABLE.bat
|
||||
• Vérifier que ça démarre
|
||||
• Ouvrir: http://localhost:8080
|
||||
• Tester la navigation
|
||||
• Fermer le serveur
|
||||
|
||||
Vérification:
|
||||
✓ Ça marche depuis la clé USB?
|
||||
✓ Pas plus lent que depuis le disque dur?
|
||||
|
||||
|
||||
📦 FICHIERS À AVOIR SUR LA CLÉ USB
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
ESSENTIELS (sans ça, ça ne marche pas):
|
||||
☑ nodejs-portable/ ← Node.js portable
|
||||
☑ src/ ← Code source
|
||||
☑ content/ ← Contenu (livres, chapitres)
|
||||
☑ node_modules/ ← Dépendances (dotenv)
|
||||
☑ START_PORTABLE.bat ← Launcher portable
|
||||
☑ server.js ← Serveur HTTP
|
||||
☑ package.json ← Config npm
|
||||
☑ index.html ← Page d'accueil
|
||||
☑ .env ← Clés API (optionnel si pas d'internet)
|
||||
|
||||
UTILES (documentation):
|
||||
☑ LISEZMOI.txt ← Guide rapide français
|
||||
☑ QUICK_START.txt ← Démarrage rapide
|
||||
☑ PORTABLE_SETUP.txt ← Setup détaillé
|
||||
☑ README_PORTABLE.md ← Doc complète
|
||||
|
||||
|
||||
🚀 DEMAIN EN COURS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
1. Brancher la clé USB
|
||||
2. Ouvrir le dossier Class_Generator
|
||||
3. Double-clic: START_PORTABLE.bat
|
||||
4. Attendre 10 secondes
|
||||
5. Ouvrir Chrome/Edge: http://localhost:8080
|
||||
6. ✅ Présenter l'application!
|
||||
|
||||
Pour arrêter:
|
||||
• Appuyer sur Ctrl+C dans la fenêtre du serveur
|
||||
• Ou fermer la fenêtre
|
||||
|
||||
|
||||
⚠️ PROBLÈMES POSSIBLES ET SOLUTIONS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Problème: "Node.js portable not found!"
|
||||
→ nodejs-portable/ n'est pas copié
|
||||
→ Vérifier que nodejs-portable/node.exe existe
|
||||
|
||||
Problème: "Port 8080 already in use"
|
||||
→ Ouvrir Gestionnaire des tâches
|
||||
→ Tuer tous les processus "node.exe"
|
||||
→ Relancer
|
||||
|
||||
Problème: Antivirus bloque
|
||||
→ Autoriser node.exe temporairement
|
||||
→ Ou demander à l'admin du PC
|
||||
|
||||
Problème: Pas d'internet
|
||||
→ Normal! L'AI ne marchera pas
|
||||
→ Utiliser les jeux et contenus locaux
|
||||
|
||||
|
||||
💡 RAPPELS IMPORTANTS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
✓ SANS INTERNET:
|
||||
• Interface complète ✅
|
||||
• Navigation ✅
|
||||
• Contenu local ✅
|
||||
• Jeux sans AI ✅
|
||||
• Flashcards ✅
|
||||
• AI exercises ❌
|
||||
• LLM scoring ❌
|
||||
|
||||
✓ PAS BESOIN:
|
||||
• Droits administrateur
|
||||
• Installation de Node.js
|
||||
• npm install
|
||||
• Internet (en cours)
|
||||
|
||||
✓ ATTENTION:
|
||||
• Le fichier .env contient tes clés API
|
||||
• Ne pas perdre la clé USB!
|
||||
• Ne pas partager avec n'importe qui
|
||||
|
||||
|
||||
🔍 VÉRIFICATION FINALE
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Coche chaque point:
|
||||
|
||||
☐ nodejs-portable/node.exe existe
|
||||
☐ START_PORTABLE.bat testé et fonctionne
|
||||
☐ Application accessible sur http://localhost:8080
|
||||
☐ Navigation testée (plusieurs pages)
|
||||
☐ Fonctionne depuis la clé USB
|
||||
☐ Clé USB prête pour demain
|
||||
☐ Batterie du PC chargée (au cas où)
|
||||
|
||||
|
||||
✅ TOUT EST BON? TU ES PRÊT!
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Demain:
|
||||
1. Arriver en cours
|
||||
2. Brancher la clé USB
|
||||
3. START_PORTABLE.bat
|
||||
4. http://localhost:8080
|
||||
5. 🚀 C'est parti!
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════════
|
||||
Préparé le 2025-10-18 | Bonne chance pour demain! 🎓
|
||||
═══════════════════════════════════════════════════════════════
|
||||
58
DOWNLOAD_NODEJS.bat
Normal file
58
DOWNLOAD_NODEJS.bat
Normal file
@ -0,0 +1,58 @@
|
||||
@echo off
|
||||
title Download Node.js Portable
|
||||
cd /d "%~dp0"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo Node.js Portable Downloader
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
:: Check if already downloaded
|
||||
if exist "nodejs-portable\node.exe" (
|
||||
echo Node.js portable is already installed!
|
||||
echo Location: %~dp0nodejs-portable\
|
||||
echo.
|
||||
for /f "delims=" %%i in ('"%~dp0nodejs-portable\node.exe" --version') do set NODE_VERSION=%%i
|
||||
echo Version: %NODE_VERSION%
|
||||
echo.
|
||||
echo You can now use START_PORTABLE.bat to launch the app!
|
||||
pause
|
||||
exit /b 0
|
||||
)
|
||||
|
||||
echo This script will download Node.js LTS portable for Windows
|
||||
echo.
|
||||
echo What you need:
|
||||
echo - Internet connection
|
||||
echo - ~50 MB of free space
|
||||
echo - A few minutes
|
||||
echo.
|
||||
echo Press any key to continue or Ctrl+C to cancel...
|
||||
pause >nul
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo Downloading Node.js...
|
||||
echo ========================================
|
||||
echo.
|
||||
echo Opening download page in your browser...
|
||||
echo.
|
||||
echo INSTRUCTIONS:
|
||||
echo 1. Download "Windows Binary (.zip)" - LTS version
|
||||
echo 2. Extract the ZIP file
|
||||
echo 3. Rename the extracted folder to "nodejs-portable"
|
||||
echo 4. Move "nodejs-portable" into this folder:
|
||||
echo %~dp0
|
||||
echo.
|
||||
echo Once done, run START_PORTABLE.bat to launch!
|
||||
echo.
|
||||
|
||||
:: Open the official Node.js download page
|
||||
start https://nodejs.org/en/download/prebuilt-binaries
|
||||
|
||||
echo.
|
||||
echo Download page opened in your browser!
|
||||
echo Follow the instructions above.
|
||||
echo.
|
||||
pause
|
||||
53
LISEZMOI.txt
Normal file
53
LISEZMOI.txt
Normal file
@ -0,0 +1,53 @@
|
||||
═══════════════════════════════════════════════════════════════
|
||||
CLASS GENERATOR 2.0 - VERSION PORTABLE
|
||||
═══════════════════════════════════════════════════════════════
|
||||
|
||||
📚 TU VEUX UTILISER ÇA EN COURS DEMAIN?
|
||||
|
||||
👉 Suis ces étapes MAINTENANT (5 minutes):
|
||||
|
||||
1. Double-clic sur: DOWNLOAD_NODEJS.bat
|
||||
→ Télécharge Node.js portable (~50 MB)
|
||||
→ Extraire le ZIP
|
||||
→ Renommer en "nodejs-portable"
|
||||
→ Copier dans CE dossier
|
||||
|
||||
2. Copier TOUT ce dossier sur ta clé USB
|
||||
|
||||
3. DEMAIN EN COURS:
|
||||
→ Brancher la clé USB
|
||||
→ Double-clic sur: START_PORTABLE.bat
|
||||
→ Ouvrir Chrome: http://localhost:8080
|
||||
→ ✅ Ça marche!
|
||||
|
||||
|
||||
📁 FICHIERS IMPORTANTS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
START_PORTABLE.bat → 🚀 UTILISE ÇA pour lancer l'app
|
||||
DOWNLOAD_NODEJS.bat → 📥 Télécharge Node.js (une fois)
|
||||
QUICK_START.txt → ⚡ Guide rapide
|
||||
PORTABLE_SETUP.txt → 📖 Instructions détaillées
|
||||
README_PORTABLE.md → 📚 Documentation complète
|
||||
|
||||
|
||||
⚠️ RAPPELS IMPORTANTS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
• SANS INTERNET = Pas d'AI (normal!)
|
||||
• Windows 10 seulement
|
||||
• Pas besoin de droits admin
|
||||
• Taille totale: ~95 MB
|
||||
|
||||
|
||||
💡 BESOIN D'AIDE?
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
1. Lire: QUICK_START.txt
|
||||
2. Lire: PORTABLE_SETUP.txt
|
||||
3. Lire: README_PORTABLE.md
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════════
|
||||
Créé le 2025-10-18 | Prêt pour utilisation en cours!
|
||||
═══════════════════════════════════════════════════════════════
|
||||
105
PORTABLE_SETUP.txt
Normal file
105
PORTABLE_SETUP.txt
Normal file
@ -0,0 +1,105 @@
|
||||
═══════════════════════════════════════════════════════════════
|
||||
CLASS GENERATOR - PORTABLE EDITION SETUP
|
||||
═══════════════════════════════════════════════════════════════
|
||||
|
||||
📋 PRÉREQUIS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
• Clé USB ou disque externe (minimum 150 MB libre)
|
||||
• Windows 10 (pas besoin de droits admin!)
|
||||
• PAS besoin d'internet pour utiliser (seulement pour setup initial)
|
||||
|
||||
🔧 INSTALLATION (À FAIRE UNE SEULE FOIS SUR TON PC)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
1. TÉLÉCHARGER NODE.JS PORTABLE
|
||||
────────────────────────────────────────────────────────────
|
||||
|
||||
Option A - Automatique (recommandé):
|
||||
• Double-cliquer sur: DOWNLOAD_NODEJS.bat
|
||||
• Attendre le téléchargement automatique
|
||||
• ✅ Terminé!
|
||||
|
||||
Option B - Manuel:
|
||||
• Aller sur: https://nodejs.org/en/download/
|
||||
• Télécharger: "Windows Binary (.zip)" - version LTS
|
||||
• Extraire le fichier ZIP
|
||||
• Renommer le dossier en "nodejs-portable"
|
||||
• Copier le dossier "nodejs-portable" dans ce dossier
|
||||
|
||||
2. VÉRIFIER LA STRUCTURE
|
||||
────────────────────────────────────────────────────────────
|
||||
Ton dossier doit ressembler à ça:
|
||||
|
||||
Class_generator/
|
||||
├── nodejs-portable/ ← Le dossier Node.js
|
||||
│ ├── node.exe ← Important!
|
||||
│ ├── npm
|
||||
│ └── node_modules/
|
||||
├── src/
|
||||
├── content/
|
||||
├── START_PORTABLE.bat ← Lance ça!
|
||||
├── server.js
|
||||
└── package.json
|
||||
|
||||
3. PREMIER LANCEMENT
|
||||
────────────────────────────────────────────────────────────
|
||||
• Double-cliquer sur: START_PORTABLE.bat
|
||||
• La première fois, ça va installer dotenv (~10 secondes)
|
||||
• Ensuite le serveur démarre!
|
||||
|
||||
🚀 UTILISATION EN COURS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
1. Brancher ta clé USB
|
||||
2. Double-cliquer sur START_PORTABLE.bat
|
||||
3. Ouvrir le navigateur: http://localhost:8080
|
||||
4. Utiliser l'application!
|
||||
|
||||
⚠️ LIMITATIONS SANS INTERNET
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Sans connexion internet, ces features ne marcheront PAS:
|
||||
• ❌ AI exercises (OpenAI/DeepSeek API)
|
||||
• ❌ LLM scoring
|
||||
• ❌ Translation API
|
||||
• ❌ Online content loading
|
||||
|
||||
Ce qui MARCHE hors-ligne:
|
||||
• ✅ Interface principale
|
||||
• ✅ Navigation
|
||||
• ✅ Contenu local (fichiers JSON dans content/)
|
||||
• ✅ Jeux sans AI
|
||||
• ✅ Flashcards locaux
|
||||
• ✅ Sauvegarde locale (dossier saves/)
|
||||
|
||||
📦 TAILLE TOTALE
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Projet actuel: 42 MB
|
||||
Node.js portable: ~50 MB
|
||||
node_modules: 1 MB
|
||||
─────────────────────────────
|
||||
TOTAL: ~95 MB
|
||||
|
||||
💡 DÉPANNAGE
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Problème: "Node.js portable not found!"
|
||||
→ Solution: Vérifier que le dossier "nodejs-portable" existe
|
||||
et contient node.exe
|
||||
|
||||
Problème: "Port 8080 already in use"
|
||||
→ Solution: Ouvrir le Gestionnaire des tâches
|
||||
Arrêter tous les processus "node.exe"
|
||||
Relancer START_PORTABLE.bat
|
||||
|
||||
Problème: Page blanche dans le navigateur
|
||||
→ Solution: Vérifier que l'URL est bien http://localhost:8080
|
||||
(pas https!)
|
||||
|
||||
Problème: AI ne fonctionne pas
|
||||
→ Solution: Normal sans internet! Utiliser les jeux locaux
|
||||
|
||||
═══════════════════════════════════════════════════════════════
|
||||
Créé le 2025-10-18 | Class Generator 2.0 Portable Edition
|
||||
═══════════════════════════════════════════════════════════════
|
||||
53
QUICK_START.txt
Normal file
53
QUICK_START.txt
Normal file
@ -0,0 +1,53 @@
|
||||
═══════════════════════════════════════════════════════════════
|
||||
CLASS GENERATOR - DÉMARRAGE RAPIDE
|
||||
═══════════════════════════════════════════════════════════════
|
||||
|
||||
🎯 PREMIÈRE UTILISATION (sur ton PC avec internet)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
1. Double-cliquer sur: DOWNLOAD_NODEJS.bat
|
||||
2. Télécharger Node.js (ça ouvre ton navigateur)
|
||||
3. Extraire et renommer en "nodejs-portable"
|
||||
4. Copier dans ce dossier
|
||||
5. Double-cliquer sur: START_PORTABLE.bat
|
||||
6. ✅ Ça marche!
|
||||
|
||||
Temps total: ~5 minutes
|
||||
|
||||
|
||||
🚀 UTILISATION EN COURS (PC sans internet)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
1. Brancher ta clé USB
|
||||
2. Double-cliquer sur: START_PORTABLE.bat
|
||||
3. Ouvrir Chrome/Edge: http://localhost:8080
|
||||
4. ✅ L'app est lancée!
|
||||
|
||||
Temps: ~10 secondes
|
||||
|
||||
|
||||
📝 FICHIERS IMPORTANTS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
START_PORTABLE.bat → Lance l'application (utilise ça!)
|
||||
DOWNLOAD_NODEJS.bat → Télécharge Node.js (une fois seulement)
|
||||
PORTABLE_SETUP.txt → Instructions détaillées
|
||||
start.bat → Ancien launcher (ignore ça)
|
||||
|
||||
|
||||
⚠️ RAPPEL: PAS D'AI SANS INTERNET
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
En cours (sans internet):
|
||||
• ❌ Exercises AI (OpenAI API)
|
||||
• ✅ Interface et navigation
|
||||
• ✅ Contenu local
|
||||
• ✅ Jeux basiques
|
||||
|
||||
|
||||
💡 BESOIN D'AIDE?
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Lire: PORTABLE_SETUP.txt (plus de détails)
|
||||
|
||||
═══════════════════════════════════════════════════════════════
|
||||
247
README_PORTABLE.md
Normal file
247
README_PORTABLE.md
Normal file
@ -0,0 +1,247 @@
|
||||
# Class Generator 2.0 - Portable Edition
|
||||
|
||||
**Version portable pour utilisation sur clé USB sans installation**
|
||||
|
||||
## 🎯 Objectif
|
||||
|
||||
Cette version permet d'utiliser Class Generator sur n'importe quel PC Windows **sans installer Node.js** et **sans droits administrateur**.
|
||||
|
||||
## 📦 Configuration Requise
|
||||
|
||||
- **Clé USB**: Minimum 150 MB d'espace libre
|
||||
- **OS**: Windows 10 ou supérieur
|
||||
- **Droits**: Aucun droit admin nécessaire
|
||||
- **Internet**: Seulement pour le setup initial (une fois)
|
||||
|
||||
## 🚀 Installation (Une fois sur ton PC)
|
||||
|
||||
### Méthode Automatique (Recommandée)
|
||||
|
||||
1. Double-cliquer sur `DOWNLOAD_NODEJS.bat`
|
||||
2. Télécharger Node.js depuis la page qui s'ouvre
|
||||
3. Extraire le fichier ZIP
|
||||
4. Renommer le dossier en `nodejs-portable`
|
||||
5. Copier `nodejs-portable` dans le dossier du projet
|
||||
6. ✅ Terminé!
|
||||
|
||||
### Méthode Manuelle
|
||||
|
||||
1. Aller sur https://nodejs.org/en/download/
|
||||
2. Télécharger **"Windows Binary (.zip)"** - Version LTS
|
||||
3. Extraire le ZIP
|
||||
4. Renommer le dossier extrait en `nodejs-portable`
|
||||
5. Copier dans le dossier du projet
|
||||
|
||||
### Structure Finale
|
||||
|
||||
```
|
||||
Class_generator/
|
||||
├── nodejs-portable/ ← Dossier Node.js portable
|
||||
│ ├── node.exe ← Important!
|
||||
│ ├── npm
|
||||
│ └── node_modules/
|
||||
├── src/
|
||||
├── content/
|
||||
├── START_PORTABLE.bat ← Lance l'application
|
||||
├── server.js
|
||||
└── package.json
|
||||
```
|
||||
|
||||
## 💻 Utilisation en Cours (Sans Internet)
|
||||
|
||||
### Démarrage
|
||||
|
||||
1. **Brancher la clé USB**
|
||||
2. **Double-cliquer** sur `START_PORTABLE.bat`
|
||||
3. **Attendre** que le serveur démarre (~5 secondes)
|
||||
4. **Ouvrir le navigateur**: http://localhost:8080
|
||||
|
||||
### Arrêt
|
||||
|
||||
- Appuyer sur `Ctrl+C` dans la fenêtre du serveur
|
||||
- Ou simplement fermer la fenêtre
|
||||
|
||||
## ⚡ Caractéristiques
|
||||
|
||||
### ✅ Fonctionne Hors-ligne
|
||||
|
||||
- Interface complète
|
||||
- Navigation et routing
|
||||
- Contenu local (fichiers JSON)
|
||||
- Jeux sans AI
|
||||
- Flashcards locaux
|
||||
- Sauvegarde locale (dossier `saves/`)
|
||||
- Debug panel (F12)
|
||||
|
||||
### ❌ Nécessite Internet
|
||||
|
||||
- AI exercises (OpenAI/DeepSeek API)
|
||||
- LLM scoring et validation
|
||||
- Translation API
|
||||
- Téléchargement de contenu en ligne
|
||||
|
||||
## 📊 Tailles de Fichiers
|
||||
|
||||
| Composant | Taille |
|
||||
|-----------|--------|
|
||||
| Projet (code + content) | ~42 MB |
|
||||
| Node.js portable | ~50 MB |
|
||||
| node_modules (dotenv) | ~1 MB |
|
||||
| **TOTAL** | **~95 MB** |
|
||||
|
||||
## 🔧 Dépannage
|
||||
|
||||
### Erreur: "Node.js portable not found!"
|
||||
|
||||
**Cause**: Le dossier `nodejs-portable` n'existe pas ou est mal placé
|
||||
|
||||
**Solution**:
|
||||
1. Vérifier que `nodejs-portable/node.exe` existe
|
||||
2. Relancer `DOWNLOAD_NODEJS.bat` si nécessaire
|
||||
|
||||
### Erreur: "Port 8080 already in use"
|
||||
|
||||
**Cause**: Un autre serveur utilise le port 8080
|
||||
|
||||
**Solution**:
|
||||
1. Ouvrir le **Gestionnaire des tâches** (Ctrl+Shift+Esc)
|
||||
2. Chercher les processus `node.exe`
|
||||
3. Les terminer tous
|
||||
4. Relancer `START_PORTABLE.bat`
|
||||
|
||||
### Page blanche dans le navigateur
|
||||
|
||||
**Cause**: Mauvaise URL ou serveur pas démarré
|
||||
|
||||
**Solution**:
|
||||
1. Vérifier l'URL: `http://localhost:8080` (pas https!)
|
||||
2. Vérifier que la fenêtre du serveur est ouverte
|
||||
3. Attendre 10 secondes après le lancement
|
||||
|
||||
### AI ne fonctionne pas
|
||||
|
||||
**Cause**: Pas de connexion internet
|
||||
|
||||
**Solution**: C'est normal! Les features AI nécessitent internet pour accéder aux API (OpenAI, DeepSeek). Utiliser les jeux et contenus locaux.
|
||||
|
||||
## 🔐 Sécurité
|
||||
|
||||
### ⚠️ Attention aux Clés API
|
||||
|
||||
Le fichier `.env` contient des clés API sensibles. Si tu copies ce dossier:
|
||||
- **Ne pas** partager la clé USB
|
||||
- **Ne pas** laisser la clé USB sans surveillance
|
||||
- **Supprimer** le fichier `.env` avant de donner à quelqu'un
|
||||
|
||||
### Version Sans Clés API
|
||||
|
||||
Pour créer une version "propre" sans clés API:
|
||||
1. Renommer `.env` en `.env.backup`
|
||||
2. Créer un nouveau `.env` vide ou avec des clés de test
|
||||
3. Copier sur la clé USB
|
||||
|
||||
## 📁 Fichiers du Système Portable
|
||||
|
||||
| Fichier | Description |
|
||||
|---------|-------------|
|
||||
| `START_PORTABLE.bat` | Lance l'application (utilise celui-ci!) |
|
||||
| `DOWNLOAD_NODEJS.bat` | Télécharge Node.js portable (une fois) |
|
||||
| `PORTABLE_SETUP.txt` | Instructions détaillées (texte brut) |
|
||||
| `QUICK_START.txt` | Guide rapide |
|
||||
| `README_PORTABLE.md` | Ce fichier |
|
||||
| `start.bat` | Ancien launcher (ne pas utiliser) |
|
||||
|
||||
## 🎓 Utilisation Pédagogique
|
||||
|
||||
### En Classe
|
||||
|
||||
1. **Préparation**: Installer Node.js portable chez toi
|
||||
2. **En cours**: Brancher USB, lancer `START_PORTABLE.bat`
|
||||
3. **Démo**: Les étudiants accèdent via leur navigateur
|
||||
4. **Arrêt**: Fermer le serveur, débrancher
|
||||
|
||||
### Partage avec Étudiants
|
||||
|
||||
Si tu veux que les étudiants aient leur propre copie:
|
||||
1. Créer une version sans `.env` (pas de clés API)
|
||||
2. Les features AI ne marcheront pas pour eux
|
||||
3. Ils auront accès aux contenus et jeux locaux
|
||||
|
||||
## 🔄 Mises à Jour
|
||||
|
||||
Pour mettre à jour le projet:
|
||||
|
||||
1. **Sur ton PC de dev**:
|
||||
- Faire tes modifications
|
||||
- Tester avec `npm start`
|
||||
|
||||
2. **Copier sur USB**:
|
||||
- Ne pas toucher à `nodejs-portable/`
|
||||
- Copier les fichiers modifiés
|
||||
- Garder `.env` et `node_modules/`
|
||||
|
||||
## 📝 Notes Techniques
|
||||
|
||||
### Pourquoi Node.js Portable?
|
||||
|
||||
- **Pas de droits admin** requis
|
||||
- **Fonctionne depuis USB** sans installation
|
||||
- **Isolé du système** - pas de conflit avec d'autres versions
|
||||
- **Portable** - même setup sur tous les PC
|
||||
|
||||
### Différences avec la Version Standard
|
||||
|
||||
| Aspect | Version Standard | Version Portable |
|
||||
|--------|-----------------|------------------|
|
||||
| Installation | `npm install` | Copier `nodejs-portable/` |
|
||||
| Lancement | `npm start` | `START_PORTABLE.bat` |
|
||||
| Node.js | Global (installé) | Local (dans le dossier) |
|
||||
| Droits admin | Possibles | Pas nécessaires |
|
||||
| Mobilité | Non | Oui (clé USB) |
|
||||
|
||||
### Path et Variables d'Environnement
|
||||
|
||||
`START_PORTABLE.bat` ajoute temporairement `nodejs-portable/` au PATH:
|
||||
```batch
|
||||
set PATH=%~dp0nodejs-portable;%PATH%
|
||||
```
|
||||
|
||||
Cette modification est **temporaire** et n'affecte pas le système.
|
||||
|
||||
## 🎯 Cas d'Usage
|
||||
|
||||
### ✅ Parfait Pour
|
||||
|
||||
- Démonstrations en cours
|
||||
- Utilisation sur PC publics (bibliothèque, salle info)
|
||||
- Tests sur différents PC
|
||||
- Backup portable du projet
|
||||
- Partage rapide avec collègues
|
||||
|
||||
### ❌ Pas Idéal Pour
|
||||
|
||||
- Développement intensif (utiliser version standard)
|
||||
- Serveur de production (utiliser déploiement cloud)
|
||||
- Utilisation quotidienne (installer Node.js normalement)
|
||||
|
||||
## 🆘 Support
|
||||
|
||||
### Problème avec la Version Portable?
|
||||
|
||||
1. Lire `PORTABLE_SETUP.txt`
|
||||
2. Vérifier la section Dépannage ci-dessus
|
||||
3. Vérifier que `nodejs-portable/node.exe` existe
|
||||
4. Essayer de relancer en mode administrateur (si possible)
|
||||
|
||||
### Retour à la Version Standard
|
||||
|
||||
Si tu préfères utiliser Node.js installé:
|
||||
1. Installer Node.js normalement
|
||||
2. Utiliser `start.bat` (pas `START_PORTABLE.bat`)
|
||||
3. Supprimer le dossier `nodejs-portable/` (optionnel)
|
||||
|
||||
---
|
||||
|
||||
**Version**: 2.0 Portable
|
||||
**Dernière mise à jour**: 2025-10-18
|
||||
**Créé pour**: Utilisation en cours sans installation
|
||||
85
START_PORTABLE.bat
Normal file
85
START_PORTABLE.bat
Normal file
@ -0,0 +1,85 @@
|
||||
@echo off
|
||||
title Class Generator - Portable Edition
|
||||
cd /d "%~dp0"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo Class Generator - Portable Edition
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
:: Check if portable Node.js exists
|
||||
if not exist "nodejs-portable\node.exe" (
|
||||
echo [ERROR] Node.js portable not found!
|
||||
echo.
|
||||
echo Please follow the setup instructions in PORTABLE_SETUP.txt
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: Add portable Node.js to PATH for this session only
|
||||
set PATH=%~dp0nodejs-portable;%PATH%
|
||||
|
||||
:: Verify Node.js is working
|
||||
echo [1/3] Checking Node.js...
|
||||
"%~dp0nodejs-portable\node.exe" --version >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo [ERROR] Node.js is not working properly
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo Node.js OK!
|
||||
|
||||
:: Check if node_modules exists
|
||||
echo [2/3] Checking dependencies...
|
||||
if not exist "node_modules" (
|
||||
echo Installing dependencies...
|
||||
"%~dp0nodejs-portable\node.exe" "%~dp0nodejs-portable\node_modules\npm\bin\npm-cli.js" install
|
||||
) else (
|
||||
echo Dependencies OK!
|
||||
)
|
||||
|
||||
:: Kill any existing servers on port 8080
|
||||
echo [3/4] Cleaning up old servers...
|
||||
taskkill /f /im node.exe >nul 2>&1
|
||||
timeout /t 1 /nobreak >nul
|
||||
|
||||
:: Start the server in background
|
||||
echo [4/4] Starting server...
|
||||
echo.
|
||||
echo ========================================
|
||||
echo Server starting on http://localhost:8080
|
||||
echo Opening browser automatically...
|
||||
echo Press Ctrl+C to stop
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
:: Start server in background
|
||||
start /b "" "%~dp0nodejs-portable\node.exe" server.js
|
||||
|
||||
:: Wait for server to start
|
||||
timeout /t 2 /nobreak >nul
|
||||
|
||||
:: Try to open Firefox, fallback to default browser
|
||||
echo Opening browser...
|
||||
start firefox http://localhost:8080 >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Firefox not found, opening default browser...
|
||||
start http://localhost:8080
|
||||
)
|
||||
|
||||
echo.
|
||||
echo Browser opened! Server is running in background.
|
||||
echo Press any key to STOP the server and close...
|
||||
pause >nul
|
||||
|
||||
:: Stop the server
|
||||
echo.
|
||||
echo Stopping server...
|
||||
taskkill /f /im node.exe >nul 2>&1
|
||||
|
||||
:: If we get here, the server stopped
|
||||
echo.
|
||||
echo Server stopped
|
||||
pause
|
||||
@ -20,7 +20,7 @@
|
||||
],
|
||||
"content_tags": ["vocabulary", "grammar", "conversation", "practical-english"],
|
||||
"total_chapters": 12,
|
||||
"available_chapters": ["7-8"],
|
||||
"available_chapters": ["2", "3", "7-8"],
|
||||
"completion_criteria": {
|
||||
"overall_progress": 80,
|
||||
"chapters_completed": 8,
|
||||
@ -28,6 +28,46 @@
|
||||
}
|
||||
},
|
||||
"chapters": [
|
||||
{
|
||||
"id": "sbs-2",
|
||||
"chapter_number": "2",
|
||||
"name": "Locations & Classrooms",
|
||||
"description": "Learn classroom objects, home locations, and practice Where questions with to be",
|
||||
"estimated_hours": 15,
|
||||
"difficulty": "beginner",
|
||||
"prerequisites": ["sbs-1"],
|
||||
"learning_objectives": [
|
||||
"Master classroom object vocabulary",
|
||||
"Learn home and location vocabulary",
|
||||
"Practice Where questions with to be",
|
||||
"Understand subject pronouns and contractions",
|
||||
"Learn greetings and basic conversations"
|
||||
],
|
||||
"vocabulary_count": 49,
|
||||
"phrases_count": 14,
|
||||
"dialogs_count": 4,
|
||||
"exercises_count": 4
|
||||
},
|
||||
{
|
||||
"id": "sbs-3",
|
||||
"chapter_number": "3",
|
||||
"name": "Present Continuous Tense",
|
||||
"description": "Learn everyday activities and master present continuous tense",
|
||||
"estimated_hours": 18,
|
||||
"difficulty": "beginner",
|
||||
"prerequisites": ["sbs-2"],
|
||||
"learning_objectives": [
|
||||
"Master present continuous tense formation",
|
||||
"Learn everyday activity vocabulary",
|
||||
"Practice What are you doing questions",
|
||||
"Understand verb -ing forms",
|
||||
"Learn to describe ongoing actions"
|
||||
],
|
||||
"vocabulary_count": 45,
|
||||
"phrases_count": 17,
|
||||
"dialogs_count": 4,
|
||||
"exercises_count": 3
|
||||
},
|
||||
{
|
||||
"id": "sbs-7-8",
|
||||
"chapter_number": "7-8",
|
||||
|
||||
55
content/books/wte2.json
Normal file
55
content/books/wte2.json
Normal file
@ -0,0 +1,55 @@
|
||||
{
|
||||
"id": "wte2",
|
||||
"name": "Welcome to English 2",
|
||||
"description": "Welcome to English 2 - Oxford University Press - A beginner English course for young learners",
|
||||
"difficulty": "beginner",
|
||||
"language": "en-US",
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2025-10-18",
|
||||
"updated": "2025-10-18",
|
||||
"source": "Welcome to English 2 - Oxford University Press",
|
||||
"target_level": "beginner",
|
||||
"total_estimated_hours": 40,
|
||||
"prerequisites": [],
|
||||
"learning_objectives": [
|
||||
"Learn basic English vocabulary for young learners",
|
||||
"Master the English alphabet (letters A-Z)",
|
||||
"Practice phonics and pronunciation",
|
||||
"Use simple sentence structures",
|
||||
"Ask and answer basic questions",
|
||||
"Read simple stories"
|
||||
],
|
||||
"content_tags": ["beginner", "young-learners", "alphabet", "phonics", "vocabulary", "basic-grammar"],
|
||||
"total_chapters": 12,
|
||||
"available_chapters": ["2"],
|
||||
"completion_criteria": {
|
||||
"overall_progress": 80,
|
||||
"chapters_completed": 8,
|
||||
"vocabulary_mastery": 85
|
||||
}
|
||||
},
|
||||
"chapters": [
|
||||
{
|
||||
"id": "wte2-2",
|
||||
"chapter_number": "2",
|
||||
"name": "Our Pet Friends & Letters W-Z",
|
||||
"description": "Learn furniture, prepositions of place, where questions, and letters W-Z",
|
||||
"estimated_hours": 4,
|
||||
"difficulty": "beginner",
|
||||
"prerequisites": ["wte2-1"],
|
||||
"learning_objectives": [
|
||||
"Use prepositions: in, on, under, near",
|
||||
"Ask and answer 'Where is/are...?' questions",
|
||||
"Identify furniture vocabulary",
|
||||
"Use contractions: isn't, aren't, let's",
|
||||
"Recognize and write letters W, X, Y, Z",
|
||||
"Read short stories about finding pets"
|
||||
],
|
||||
"vocabulary_count": 41,
|
||||
"phrases_count": 17,
|
||||
"dialogs_count": 2,
|
||||
"exercises_count": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
442
content/chapters/SBS2.txt
Normal file
442
content/chapters/SBS2.txt
Normal file
@ -0,0 +1,442 @@
|
||||
# SBS2 PDF - Text Extraction
|
||||
|
||||
## Page 1: In the Classroom
|
||||
|
||||
### Vocabulary List:
|
||||
1. pen
|
||||
2. book
|
||||
3. pencil
|
||||
4. notebook
|
||||
5. bookshelf
|
||||
6. globe
|
||||
7. map
|
||||
8. board
|
||||
9. wall
|
||||
10. clock
|
||||
11. bulletin board
|
||||
12. computer
|
||||
13. table
|
||||
14. chair
|
||||
15. ruler
|
||||
16. desk
|
||||
17. dictionary
|
||||
|
||||
---
|
||||
|
||||
## Page 2: Where Is It?
|
||||
|
||||
### Grammar Examples:
|
||||
(Where is) Where's the book?
|
||||
(It is) It's on the desk.
|
||||
|
||||
### Dialogue Examples:
|
||||
- Where's the book? → It's on the desk.
|
||||
- Where's the map? → It's on the wall.
|
||||
- Where's the computer? → It's on the table.
|
||||
|
||||
### Exercises:
|
||||
1. Where's the pen?
|
||||
2. Where's the board?
|
||||
3. Where's the globe?
|
||||
4. Where's the ruler?
|
||||
5. Where's the pencil?
|
||||
6. Where's the clock?
|
||||
7. Where's the notebook?
|
||||
8. Where's the dictionary?
|
||||
9. Where's the bulletin board?
|
||||
|
||||
### Activity:
|
||||
**Make a List!**
|
||||
Work with another student. Make a list of all the objects in your classroom. Present your list to the class. Who has the best list?
|
||||
|
||||
---
|
||||
|
||||
## Page 3: At Home
|
||||
|
||||
### Vocabulary List:
|
||||
1. living room
|
||||
2. dining room
|
||||
3. kitchen
|
||||
4. bedroom
|
||||
5. bathroom
|
||||
6. attic
|
||||
7. yard
|
||||
8. garage
|
||||
9. basement
|
||||
|
||||
---
|
||||
|
||||
## Page 4: Where Are You?
|
||||
|
||||
### Grammar Chart:
|
||||
|
||||
**Where**
|
||||
|
||||
| am/is/are | Pronouns | Full Form | Contraction | Location |
|
||||
|-----------|----------|-----------|-------------|----------|
|
||||
| am | I | (I am) | I'm | in the kitchen. |
|
||||
| is | he/she/it | (He is)/(She is)/(It is) | He's/She's/It's | |
|
||||
| are | we/you/they | (We are)/(You are)/(They are) | We're/You're/They're | |
|
||||
|
||||
### Dialogue Examples:
|
||||
- Where are you? → I'm in the kitchen.
|
||||
- Where are you? → We're in the living room.
|
||||
- Where are Mr. and Mrs. Jones? → They're in the yard.
|
||||
|
||||
### Exercises:
|
||||
1. Where are you?
|
||||
2. Where are you?
|
||||
3. Where are Jim and Pam?
|
||||
4. Where are you?
|
||||
5. Where are Mr. and Mrs. Park?
|
||||
6. Where are you?
|
||||
7. Where are you?
|
||||
8. Where are you and Ben?
|
||||
9. Where are Mr. and Mrs. Hernandez?
|
||||
|
||||
---
|
||||
|
||||
## Page 5: Where's Bob?
|
||||
|
||||
### Dialogue Examples:
|
||||
- Where's* Bob? → He's in the living room.
|
||||
- Where's Mary? → She's in the bedroom.
|
||||
- Where's the car? → It's in the garage.
|
||||
|
||||
*Where's = Where is
|
||||
|
||||
### Exercises:
|
||||
1. Where's Tim?
|
||||
2. Where's Rosa?
|
||||
3. Where's the newspaper?
|
||||
4. Where's Peggy?
|
||||
5. Where's the telephone book?
|
||||
6. Where's Harry?
|
||||
7. Where's Ellen?
|
||||
8. Where's Kevin?
|
||||
9. Where's the cell phone?
|
||||
|
||||
---
|
||||
|
||||
## Page 6: READING
|
||||
|
||||
### THE STUDENTS IN MY ENGLISH CLASS
|
||||
|
||||
The students in my English class are very interesting. Henry is Chinese. He's from Shanghai. Linda is Puerto Rican. She's from San Juan. Mr. and Mrs. Kim are Korean. They're from Seoul.
|
||||
|
||||
George is Greek. He's from Athens. Carla is Italian. She's from Rome. Mr. and Mrs. Sato are Japanese. They're from Tokyo. My friend Maria and I are Mexican. We're from Mexico City.
|
||||
|
||||
Yes, the students in my English class are very interesting. We're from many different countries . . . and we're friends.
|
||||
|
||||
### READING CHECK-UP
|
||||
**True or False?**
|
||||
1. Linda is Korean.
|
||||
2. George is Greek.
|
||||
3. Henry is from Mexico City.
|
||||
4. Mr. Kim is from Seoul.
|
||||
5. Carla is Chinese.
|
||||
6. The students in the class are from many countries.
|
||||
|
||||
### How About You?
|
||||
Tell about the students in YOUR English class. Where are they from?
|
||||
|
||||
---
|
||||
|
||||
### How to Say It!
|
||||
|
||||
**Greeting People**
|
||||
- A: Hi. How are you?
|
||||
- B: Fine. And you?
|
||||
- A: Fine, thanks.
|
||||
|
||||
Practice conversations with other students.
|
||||
|
||||
---
|
||||
|
||||
## Page 7: Where Are They?
|
||||
|
||||
**Ask and answer questions based on these pictures.**
|
||||
|
||||
1. ________ Albert? (RESTAURANT)
|
||||
2. ________ Carmen? (BANK)
|
||||
3. ________ Walter and Mary? (SUPERMARKET)
|
||||
4. ________ you? (LIBRARY)
|
||||
5. ________ you? (PARK)
|
||||
6. ________ Kate? (MOVIE THEATER)
|
||||
7. ________ Mr. and Mrs. Lee? (POST OFFICE)
|
||||
8. ________ monkey? (ZOO)
|
||||
9. ________ (HOSPITAL)
|
||||
|
||||
**Now add people and places of your own.**
|
||||
|
||||
10. __________________?
|
||||
11. __________________?
|
||||
12. __________________?
|
||||
|
||||
---
|
||||
|
||||
## Page 8: READING
|
||||
|
||||
### ALL THE STUDENTS IN MY ENGLISH CLASS ARE ABSENT TODAY
|
||||
|
||||
All the students in my English class are absent today. George is absent. He's in the hospital. Maria is absent. She's at the dentist. Mr. and Mrs. Sato are absent. They're at the social security office. Even our English teacher is absent. He's home in bed!
|
||||
|
||||
What a shame! Everybody in my English class is absent today. Everybody except me.
|
||||
|
||||
### READING CHECK-UP
|
||||
**True or False?**
|
||||
1. George is absent.
|
||||
2. Maria is absent.
|
||||
3. Mr. and Mrs. Sato are absent.
|
||||
4. The English teacher is absent.
|
||||
|
||||
### How About You?
|
||||
Tell about YOUR English class:
|
||||
- Which students are in class today?
|
||||
- Which students are absent today?
|
||||
- Where are they?
|
||||
|
||||
---
|
||||
|
||||
## LISTENING
|
||||
|
||||
### WHAT'S THE WORD?
|
||||
Listen and choose the correct answer.
|
||||
1. a. bank b. park
|
||||
2. a. hospital b. library
|
||||
3. a. She's b. She's
|
||||
4. a. She's b. She's
|
||||
5. a. We're b. They're
|
||||
6. a. We're b. They're
|
||||
|
||||
### WHERE ARE THEY?
|
||||
Listen and choose the correct place.
|
||||
1. a. living room b. dining room
|
||||
2. a. bathroom b. bedroom
|
||||
3. a. garage b. yard
|
||||
4. a. bathroom b. bedroom
|
||||
5. a. kitchen b. living room
|
||||
6. a. bedroom b. basement
|
||||
|
||||
---
|
||||
|
||||
## Page 9: PRONUNCIATION - Reduced "and"
|
||||
|
||||
### Mr. and Mrs.
|
||||
|
||||
**Listen. Then say it.**
|
||||
- Mr. and Mrs. Jones
|
||||
- Mr. and Mrs. Park
|
||||
- Jim and Pam
|
||||
- You and Ben
|
||||
|
||||
**Say it. Then listen.**
|
||||
- Mr. and Mrs. Lee
|
||||
- Mr. and Mrs. Miller
|
||||
- Walter and Mary
|
||||
- Jim and I
|
||||
|
||||
### Projects:
|
||||
|
||||
**SIDE by SIDE JOURNAL**
|
||||
Draw a picture of your apartment or house. Label the rooms.
|
||||
|
||||
**Project**
|
||||
Work with another student. Draw a picture of your classroom. Label all the objects.
|
||||
|
||||
---
|
||||
|
||||
## CHAPTER SUMMARY
|
||||
|
||||
### GRAMMAR 语法
|
||||
|
||||
**SUBJECT PRONOUNS 主格代词**
|
||||
**TO BE + LOCATION TO BE + 地点**
|
||||
|
||||
| Where | am/is/are | Pronouns | Full Form | Contraction | Location |
|
||||
|-------|-----------|----------|-----------|-------------|----------|
|
||||
| | am | I? | (I am) | I'm | |
|
||||
| | is | he?/she?/it? | (He is)/(She is)/(It is) | He's/She's/It's | in the kitchen. |
|
||||
| | are | we?/you?/they? | (We are)/(You are)/(They are) | We're/You're/They're | |
|
||||
|
||||
### KEY VOCABULARY 关键词汇
|
||||
|
||||
**CLASSROOM OBJECTS 教室物品**
|
||||
- board
|
||||
- book
|
||||
- bookshelf
|
||||
- bulletin board
|
||||
- chair
|
||||
- clock
|
||||
- computer
|
||||
- desk
|
||||
- dictionary
|
||||
- globe
|
||||
- map
|
||||
- notebook
|
||||
- pen
|
||||
- pencil
|
||||
- ruler
|
||||
- table
|
||||
- wall
|
||||
|
||||
**PLACES AT HOME 家中布局**
|
||||
- attic
|
||||
- basement
|
||||
- bathroom
|
||||
- bedroom
|
||||
- dining room
|
||||
- garage
|
||||
- kitchen
|
||||
- living room
|
||||
- yard
|
||||
|
||||
**PLACES AROUND TOWN 市内场所**
|
||||
- bank
|
||||
- hospital
|
||||
- library
|
||||
- movie theater
|
||||
- park
|
||||
- post office
|
||||
- restaurant
|
||||
- supermarket
|
||||
- zoo
|
||||
|
||||
**GREETING PEOPLE 问候**
|
||||
- Hi. How are you?
|
||||
- Fine. And you?
|
||||
- Fine, thanks.
|
||||
|
||||
---
|
||||
|
||||
## TEACHER'S COURSE NOTES
|
||||
|
||||
### Lesson 1 - First Class (第一次课)
|
||||
|
||||
**Key Vocabulary (重点词汇):**
|
||||
- pen: 钢笔
|
||||
- pencil: 铅笔
|
||||
- book: 书
|
||||
- desk: 书桌;办公桌
|
||||
- computer: 计算机;电脑
|
||||
- bank: 银行
|
||||
- supermarket: 超市
|
||||
- post office: 邮局
|
||||
- restaurant: 餐馆;饭店
|
||||
- library: 图书馆
|
||||
- living room: 客厅;起居室
|
||||
- dining room: 餐厅;饭厅
|
||||
- kitchen: 厨房
|
||||
- bedroom: 卧室
|
||||
- bathroom: 浴室;洗手间
|
||||
|
||||
**Key Sentences (重点句子):**
|
||||
- Where are you? We are in the kitchen.
|
||||
- Where are they? They are in yard.
|
||||
|
||||
**Key Content (重点内容):**
|
||||
1. 人称代词的用法 (Usage of personal pronouns)
|
||||
2. 地点的用法 (Usage of locations)
|
||||
|
||||
**Homework Review Suggestions (课后复习建议):**
|
||||
1. 读P7P8的单词,读P9的上面三幅图下面1-9幅图,完成每天的语音打卡。
|
||||
2. P9上面的三幅图背会,发送语音打卡。
|
||||
|
||||
---
|
||||
|
||||
### Lesson 2 - Second Class
|
||||
|
||||
**Key Vocabulary (重点词汇):**
|
||||
- pen: 钢笔
|
||||
- pencil: 铅笔
|
||||
- book: 书
|
||||
- desk: 书桌;办公桌
|
||||
- computer: 计算机;电脑
|
||||
- bank: 银行
|
||||
- supermarket: 超市
|
||||
- post office: 邮局
|
||||
- restaurant: 餐馆;饭店
|
||||
- library: 图书馆
|
||||
- living room: 客厅;起居室
|
||||
- dining room: 餐厅;饭厅
|
||||
- kitchen: 厨房
|
||||
- bedroom: 卧室
|
||||
- bathroom: 浴室;洗手间
|
||||
- clock: 时钟,钟
|
||||
- bulletin board: 布告栏,公告板
|
||||
- computer: 计算机,电脑
|
||||
- globe: 地球仪;地球;世界
|
||||
- notebook: 笔记本
|
||||
- bookshelf: 书架
|
||||
- dictionary: 词典,字典
|
||||
- attic: 阁楼,顶楼
|
||||
- yard: 院子;场地
|
||||
- garage: 车库
|
||||
- basement: 地下室
|
||||
- movie theater: 电影院
|
||||
|
||||
**Key Sentences (重点句子):**
|
||||
- Where are you? We are in the kitchen.
|
||||
- Where are they? They are in the yard.
|
||||
|
||||
**Key Content (重点内容):**
|
||||
1. 人称代词的用法 (Usage of personal pronouns)
|
||||
2. 地点的用法 (Usage of locations)
|
||||
|
||||
**Homework Review Suggestions (课后复习建议):**
|
||||
1. 读P7P8P10的单词(直接读就可以啦,不用拼读),读P9P11的对话,读P13小短文,完成每日语音打卡。
|
||||
2. 抄写重点单词一个2遍,句子一个2遍,中文意思1遍,下节课默写。
|
||||
3. 预习P13-P14的生单词。
|
||||
4. 完成练习册P7-P8。
|
||||
5. 音标练习Day 1完成。音标单词朗读,完成每日语音打卡。
|
||||
|
||||
---
|
||||
|
||||
### Lesson 3 - Third Class
|
||||
|
||||
**Key Vocabulary (重点词汇):**
|
||||
- dictionary: 词典,字典
|
||||
- attic: 阁楼,顶楼
|
||||
- yard: 院子;场地
|
||||
- garage: 车库
|
||||
- basement: 地下室
|
||||
- movie theater: 电影院
|
||||
- hospital: 医院
|
||||
- absent: 缺席的
|
||||
- dentist: 牙科医生
|
||||
- social security office: 社会保障办公室
|
||||
- shame: 羞耻,羞愧;憾事
|
||||
- except: 除了
|
||||
- everybody: 每个人,所有人
|
||||
- interesting: 有趣的,有意思的
|
||||
- different: 不同的
|
||||
- countries: country(国家;乡村)的复数形式
|
||||
- Chinese: 中国的;中国人
|
||||
- Japanese: 日本的;日本人
|
||||
- Korean: 韩国的;韩国人
|
||||
- Italian: 意大利的;意大利人
|
||||
- Mexican: 墨西哥的;墨西哥人
|
||||
- Greek: 希腊的;希腊人
|
||||
|
||||
**Key Sentence Patterns (重点句型):**
|
||||
1. All the students in my English class are absent today.
|
||||
2. What a shame!
|
||||
3. Everybody except me.
|
||||
4. The students in my English class are very interesting.
|
||||
5. We're from many different countries.
|
||||
|
||||
**Key Content (重点内容):**
|
||||
1. 人称代词的用法 (Usage of personal pronouns)
|
||||
2. 地点的用法 (Usage of locations)
|
||||
3. 国家及国家的人表达形式 (Expression of countries and nationalities)
|
||||
4. 日常打招呼用语 (Daily greeting expressions)
|
||||
|
||||
**Homework Review Suggestions (课后复习建议):**
|
||||
1. 读P7P8P10的单词,每个一遍不用拼读,P13课文P15课文,完成每日语音打卡。
|
||||
2. 抄写重点单词一个2遍,句子一个2遍,中文意思1遍。
|
||||
3. P13的课文读熟,第二段背会,完成语音打卡。
|
||||
4. 练习册P6-P10完成。(听力不做)
|
||||
5. 音标Day 2练习,完成语音打卡。
|
||||
|
||||
**Teacher's Comments:**
|
||||
这周表扬Leon和Joey小朋友听写全对,而且能够做到每天打卡,很棒哦,继续保持👍,其他小朋友也要加油啦,养成良好的习惯哦
|
||||
363
content/chapters/SBS3.txt
Normal file
363
content/chapters/SBS3.txt
Normal file
@ -0,0 +1,363 @@
|
||||
# SBS Chapter 3 - Present Continuous Tense
|
||||
|
||||
## Everyday Activities
|
||||
|
||||
---
|
||||
|
||||
## VOCABULARY PREVIEW
|
||||
|
||||
### Everyday Activities (日常活动)
|
||||
|
||||
1. eating
|
||||
2. drinking
|
||||
3. cooking
|
||||
4. reading
|
||||
5. studying
|
||||
6. teaching
|
||||
7. singing
|
||||
8. sleeping
|
||||
9. swimming
|
||||
10. planting
|
||||
11. watching TV
|
||||
12. listening to music
|
||||
13. playing cards
|
||||
14. playing baseball
|
||||
15. playing the piano
|
||||
|
||||
---
|
||||
|
||||
## Page 18: What Are You Doing?
|
||||
|
||||
### Grammar Chart
|
||||
|
||||
**What**
|
||||
|
||||
| am/is/are | Pronouns | Question | Full Form | Contraction | Activity |
|
||||
|-----------|----------|----------|-----------|-------------|----------|
|
||||
| am | I | doing? | (I am) | I'm | eating. |
|
||||
| is | he/she/it | | (He is)/(She is)/(It is) | He's/She's/It's | |
|
||||
| are | we/you/they | | (We are)/(You are)/(They are) | We're/You're/They're | |
|
||||
|
||||
### Dialogue Examples
|
||||
|
||||
**Scene 1:**
|
||||
- What are you doing? → I'm reading.
|
||||
- What are you doing? → We're cooking.
|
||||
- What are Mary and Fred doing? → They're studying English.
|
||||
|
||||
**Scene 2:**
|
||||
- What's Tom doing? → He's eating.
|
||||
- What's Martha doing? → She's watching TV.
|
||||
- What's your dog doing? → It's sleeping.
|
||||
|
||||
---
|
||||
|
||||
## Page 19: Practice Exercises
|
||||
|
||||
### Complete the dialogues:
|
||||
|
||||
1. **A.** What are you doing?
|
||||
**B.** __________ reading the newspaper.
|
||||
|
||||
2. **A.** __________ Mr. and Mrs. Lane doing?
|
||||
**B.** __________ cooking dinner.
|
||||
|
||||
3. **A.** __________ you and Judy doing?
|
||||
**B.** __________ eating dinner.
|
||||
|
||||
4. **A.** __________ Rita doing?
|
||||
**B.** __________ studying English.
|
||||
|
||||
5. **A.** __________ Henry doing?
|
||||
**B.** __________ sleeping.
|
||||
|
||||
6. **A.** __________ Carol and Ken doing?
|
||||
**B.** __________ watching TV.
|
||||
|
||||
7. **A.** __________ Irene doing?
|
||||
**B.** __________ playing the piano.
|
||||
|
||||
8. **A.** What are YOU doing?
|
||||
**B.** I'm __________.
|
||||
|
||||
---
|
||||
|
||||
## Page 20-21: What's Everybody Doing?
|
||||
|
||||
### Example Dialogue:
|
||||
- **A.** Where's Walter?
|
||||
- **B.** He's in the kitchen.
|
||||
- **A.** What's he doing?
|
||||
- **B.** He's eating breakfast.
|
||||
|
||||
### Practice Situations:
|
||||
|
||||
1. **Karen**
|
||||
- park
|
||||
- eating lunch
|
||||
|
||||
2. **Mr. and Mrs. Clark**
|
||||
- dining room
|
||||
- eating dinner
|
||||
|
||||
3. **you**
|
||||
- bedroom
|
||||
- playing the guitar
|
||||
|
||||
4. **you**
|
||||
- living room
|
||||
- playing cards
|
||||
|
||||
5. **Gary and Jane**
|
||||
- yard
|
||||
- playing baseball
|
||||
|
||||
6. **Miss Baker**
|
||||
- cafeteria
|
||||
- drinking milk
|
||||
|
||||
7. **you**
|
||||
- library
|
||||
- studying English
|
||||
|
||||
8. **Ms. Johnson**
|
||||
- classroom
|
||||
- teaching mathematics
|
||||
|
||||
10. **Martha**
|
||||
- hospital
|
||||
- watching TV
|
||||
|
||||
11. **Martin**
|
||||
- bathroom
|
||||
- singing
|
||||
|
||||
12. **your friend**
|
||||
- park
|
||||
- listening to music
|
||||
|
||||
### How to Say It!
|
||||
|
||||
**Checking Understanding**
|
||||
- A. Where's Walter?
|
||||
- B. He's in the kitchen.
|
||||
- A. In the kitchen?
|
||||
- B. Yes.
|
||||
|
||||
Practice conversations with other students.
|
||||
|
||||
---
|
||||
|
||||
### Action Game!
|
||||
|
||||
**Instructions:**
|
||||
- "What am I doing?" → "You're playing the guitar."
|
||||
|
||||
Pantomime an everyday activity for the class. Ask students, "What am I doing?"
|
||||
|
||||
---
|
||||
|
||||
## Page 22: READING
|
||||
|
||||
### IN THE PARK
|
||||
|
||||
The Jones family is in the park today. The sun is shining, and the birds are singing. It's a beautiful day!
|
||||
|
||||
Mr. Jones is reading the newspaper. Mrs. Jones is listening to the radio. Sally and Patty Jones are studying. And Tommy Jones is playing the guitar.
|
||||
|
||||
The Jones family is very happy today. It's a beautiful day, and they're in the park.
|
||||
|
||||
---
|
||||
|
||||
### AT HOME IN THE YARD
|
||||
|
||||
The Chen family is at home in the yard today. The sun is shining, and the birds are singing. It's a beautiful day!
|
||||
|
||||
Mr. Chen is planting flowers. Mrs. Chen is drinking lemonade and reading a book. Emily and Jason Chen are playing with the dog. And Jennifer Chen is sleeping.
|
||||
|
||||
The Chen family is very happy today. It's a beautiful day, and they're at home in the yard.
|
||||
|
||||
---
|
||||
|
||||
## Page 23: READING CHECK-UP
|
||||
|
||||
### True or False?
|
||||
|
||||
1. The Jones family is at home in the yard today.
|
||||
2. Mr. Chen is planting flowers.
|
||||
3. Patty Jones is studying.
|
||||
4. Jason Chen is reading a book.
|
||||
5. The Chen family is singing.
|
||||
6. The Jones family and the Chen family are very happy today.
|
||||
|
||||
---
|
||||
|
||||
### Q & A
|
||||
|
||||
**Using this model, make questions and answers based on the stories on page 22.**
|
||||
|
||||
- **A.** What's Mr. Jones doing?
|
||||
- **B.** He's reading the newspaper.
|
||||
|
||||
---
|
||||
|
||||
## LISTENING
|
||||
|
||||
### Listen and choose the correct answer.
|
||||
|
||||
1. a. She's studying.
|
||||
b. I'm studying.
|
||||
|
||||
2. a. He's eating.
|
||||
b. She's eating.
|
||||
|
||||
3. a. He's watching TV.
|
||||
b. She's watching TV.
|
||||
|
||||
4. a. We're cooking dinner.
|
||||
b. They're cooking dinner.
|
||||
|
||||
5. a. We're planting flowers.
|
||||
b. They're planting flowers.
|
||||
|
||||
6. a. You're playing baseball.
|
||||
b. We're playing baseball.
|
||||
|
||||
---
|
||||
|
||||
## IN YOUR OWN WORDS
|
||||
|
||||
### For Writing and Discussion
|
||||
|
||||
**AT THE BEACH**
|
||||
|
||||
The Martinez family is at the beach today. Using this picture, tell a story about the Martinez family.
|
||||
|
||||
*[Image shows the Martinez family at the beach with various family members doing different activities]*
|
||||
|
||||
---
|
||||
|
||||
## Page 24: PRONUNCIATION
|
||||
|
||||
### Reduced "What are" & "Where are"
|
||||
|
||||
**Listen. Then say it.**
|
||||
- What are you doing?
|
||||
- What are Jim and Jane doing?
|
||||
- Where are Mary and Fred?
|
||||
- Where are you and Judy?
|
||||
|
||||
**Say it. Then listen.**
|
||||
- What are they doing?
|
||||
- What are Carol and Ken doing?
|
||||
- Where are Mr. and Mrs. Lane?
|
||||
- Where are you and Henry?
|
||||
|
||||
---
|
||||
|
||||
### SIDE by SIDE JOURNAL
|
||||
|
||||
What are you doing now?
|
||||
What are your friends doing?
|
||||
Write about it in your journal.
|
||||
|
||||
---
|
||||
|
||||
## CHAPTER SUMMARY
|
||||
|
||||
### GRAMMAR 语法
|
||||
|
||||
**PRESENT CONTINUOUS TENSE 现在进行时**
|
||||
|
||||
| What | am/is/are | Pronouns | Question | Full Form | Contraction | Activity |
|
||||
|------|-----------|----------|----------|-----------|-------------|----------|
|
||||
| | am | I | doing? | (I am) | I'm | |
|
||||
| | is | he/she/it | | (He is)/(She is)/(It is) | He's/She's/It's | eating. |
|
||||
| | are | we/you/they | | (We are)/(You are)/(They are) | We're/You're/They're | |
|
||||
|
||||
---
|
||||
|
||||
### KEY VOCABULARY 关键词汇
|
||||
|
||||
**EVERYDAY ACTIVITIES 日常活动**
|
||||
|
||||
- cooking dinner
|
||||
- drinking milk/lemonade
|
||||
- eating breakfast/lunch/dinner
|
||||
- listening to music/the radio
|
||||
- planting flowers
|
||||
- playing cards
|
||||
- playing baseball
|
||||
- playing the guitar/the piano
|
||||
- reading a book/the newspaper
|
||||
- singing
|
||||
- sleeping
|
||||
- studying English
|
||||
- swimming
|
||||
- teaching
|
||||
- watching TV
|
||||
|
||||
**CHECKING UNDERSTANDING**
|
||||
- In the kitchen?
|
||||
|
||||
---
|
||||
|
||||
## Page 25: Side by Side Gazette
|
||||
|
||||
### FACT FILE
|
||||
|
||||
**Titles**
|
||||
- **Mr.** is a title for a man.
|
||||
- **Ms., Mrs.,** and **Miss** are titles for a woman.
|
||||
|
||||
---
|
||||
|
||||
### Nicknames
|
||||
|
||||
"My name is David. My nickname is Dave."
|
||||
|
||||
#### COMMON NICKNAMES
|
||||
|
||||
| Name | Nickname | Name | Nickname |
|
||||
|------|----------|------|----------|
|
||||
| James | Jim | Elizabeth | Liz, Betty |
|
||||
| Peter | Pete | Jennifer | Jenny |
|
||||
| Robert | Bob | Judith | Judy |
|
||||
| Timothy | Tim | Katherine | Kathy, Kate |
|
||||
| Thomas | Tom | Patricia | Patty |
|
||||
| William | Bill | Susan | Sue |
|
||||
|
||||
---
|
||||
|
||||
### Global Exchange
|
||||
|
||||
**SungHee:** Hello. My name is Sung Hee. I'm Korean. I'm from Seoul. I'm a student. Right now I'm in my English class. I'm looking for a keypal in a different country.
|
||||
|
||||
**DanielR:** Hi, Sung Hee! My name is Daniel. My nickname is Danny. My last name is Rivera. I'm Mexican. I'm from Mexico City. I'm a student. Right now I'm at home. I'm at my computer, and I'm listening to music. I'm also looking for a keypal. Tell me about your school and your English class.
|
||||
|
||||
---
|
||||
|
||||
**Activity:** Send a message over the Internet. Tell about yourself. Find a keypal.
|
||||
|
||||
---
|
||||
|
||||
### BUILD YOUR VOCABULARY!
|
||||
|
||||
**Playing Instruments, Sports, and Games**
|
||||
|
||||
I'm playing _________.
|
||||
|
||||
#### Instruments
|
||||
- the violin
|
||||
- the clarinet
|
||||
- the trumpet
|
||||
|
||||
#### Sports
|
||||
- soccer
|
||||
- tennis
|
||||
- basketball
|
||||
|
||||
#### Games
|
||||
- chess
|
||||
- checkers
|
||||
- tic tac toe
|
||||
395
content/chapters/WTE2-2.txt
Normal file
395
content/chapters/WTE2-2.txt
Normal file
@ -0,0 +1,395 @@
|
||||
# Welcome to English 2 - Unit 2: Our Pet Friends + Letters W X Y Z
|
||||
|
||||
---
|
||||
|
||||
## Unit 2: Our Pet Friends
|
||||
|
||||
### Page 7: Where are the children's pets? Read.
|
||||
|
||||
**Vocabulary - Furniture (家具词汇):**
|
||||
1. a sofa - 沙发
|
||||
2. a table - 桌子
|
||||
3. a chair - 椅子
|
||||
4. a box - 盒子;箱子
|
||||
5. a cupboard - 橱柜;碗柜
|
||||
6. a shelf - 架子;搁板
|
||||
|
||||
**Dialogue:**
|
||||
|
||||
**Scene 1:**
|
||||
- **Tom (1):** Where is the cat?
|
||||
- **Mary (2):** It is on the chair.
|
||||
- **Betty (5):** Where are the turtles?
|
||||
|
||||
**Scene 2:**
|
||||
- **Sally (3):** Where are the hamsters?
|
||||
- **Peter (4):** One is in the cupboard. One is near the sofa.
|
||||
- **Charlie (6):** They are under the sofa.
|
||||
|
||||
---
|
||||
|
||||
### Page 8: Help the children find the other pets. Ask and answer questions.
|
||||
|
||||
**Prepositions (介词):**
|
||||
- on - 在……上面
|
||||
- in - 在……里面
|
||||
- near - 在……附近
|
||||
- under - 在……下面
|
||||
|
||||
**Practice Structure:**
|
||||
|
||||
Where | is/are | the _______ ? | It is / They are | _______ .
|
||||
|
||||
**Characters:** Tom and Mary are asking about pets (hamster, bird, rabbit, turtles)
|
||||
|
||||
---
|
||||
|
||||
## Page 9: Learn to Read - Where is Bob?
|
||||
|
||||
### Story: Where is Bob? Read and find out.
|
||||
### 故事:鲍勃在哪里?阅读并找出答案。
|
||||
|
||||
**Key Vocabulary (重点词汇):**
|
||||
- dog - 狗
|
||||
- sad - 伤心的;难过的
|
||||
- find - 找到;发现
|
||||
- cupboard - 橱柜
|
||||
- bag - 包;袋子
|
||||
- sofa - 沙发
|
||||
- bed - 床
|
||||
|
||||
**1.** Ricky is Bob's dog.
|
||||
瑞奇是鲍勃的狗。
|
||||
Ricky is sad.
|
||||
瑞奇很伤心。
|
||||
He cannot find Bob.
|
||||
他找不到鲍勃。
|
||||
|
||||
**2.** Is Bob under the cupboard?
|
||||
鲍勃在橱柜下面吗?
|
||||
No, he isn't.
|
||||
不,他不在。
|
||||
|
||||
**3.** Where is Bob?
|
||||
鲍勃在哪里?
|
||||
Is he in the bag?
|
||||
他在包里吗?
|
||||
No, Ricky. Bob isn't in the bag.
|
||||
不,瑞奇。鲍勃不在包里。
|
||||
|
||||
**4.** Is Bob on the sofa?
|
||||
鲍勃在沙发上吗?
|
||||
No, Bob isn't on the sofa.
|
||||
不,鲍勃不在沙发上。
|
||||
|
||||
**Note:**
|
||||
- isn't = is not
|
||||
- Let's = Let us
|
||||
|
||||
---
|
||||
|
||||
### Page 10: Story Continues
|
||||
### 第10页:故事继续
|
||||
|
||||
**5.** Come on, Ricky.
|
||||
来吧,瑞奇。
|
||||
Let's find Bob.
|
||||
我们一起找鲍勃吧。
|
||||
|
||||
**6.** Look, Ricky.
|
||||
看,瑞奇。
|
||||
Bob is on the bed!
|
||||
鲍勃在床上!
|
||||
Ricky!
|
||||
瑞奇!
|
||||
|
||||
---
|
||||
|
||||
### Page 10: Comprehension Exercise
|
||||
### 第10页:理解练习
|
||||
|
||||
**In the story, where does Ricky look for Bob? Tick (✓).**
|
||||
**在故事中,瑞奇在哪里找鲍勃?打勾(✓)。**
|
||||
|
||||
| | bag (包) | cupboard (橱柜) | sofa (沙发) |
|
||||
|---|-----|----------|------|
|
||||
| 1 | in (在……里面) | | |
|
||||
| 2 | on (在……上面) | | |
|
||||
| 3 | under (在……下面) | | |
|
||||
|
||||
---
|
||||
|
||||
### Phonics
|
||||
### 语音
|
||||
|
||||
**Say the sound and the words.**
|
||||
**读出这个音和单词。**
|
||||
|
||||
**Sound: a**
|
||||
**音:a**
|
||||
|
||||
Words:
|
||||
- cat - 猫
|
||||
- fat - 胖的
|
||||
- sad - 伤心的
|
||||
- Dad - 爸爸
|
||||
|
||||
**Can you say these words?**
|
||||
**你能读这些单词吗?**
|
||||
- hat - 帽子
|
||||
- bad - 坏的
|
||||
|
||||
---
|
||||
|
||||
## Page 11: Practice Activity
|
||||
## 第11页:练习活动
|
||||
|
||||
### The pets are hiding. Can you find them? Ask and answer questions.
|
||||
### 宠物们藏起来了。你能找到它们吗?问答问题。
|
||||
|
||||
**Pets to find (要找的宠物):**
|
||||
1. cat - 猫
|
||||
2. hamsters - 仓鼠
|
||||
3. rabbit - 兔子
|
||||
4. turtles - 乌龟
|
||||
|
||||
**Scene (场景):** A bedroom with bed, cupboard, and box
|
||||
**场景:** 一个有床、橱柜和盒子的卧室
|
||||
|
||||
**Example Dialogue (对话示例):**
|
||||
|
||||
- Where is the cat? **Is it** near the cupboard?
|
||||
猫在哪里?**它在**橱柜附近吗?
|
||||
- **No, it isn't.**
|
||||
**不,它不在。**
|
||||
- **Is it** in the box?
|
||||
**它在**盒子里吗?
|
||||
- **Yes, it is.**
|
||||
**是的,它在。**
|
||||
- Where are the hamsters? **Are they** ...?
|
||||
仓鼠在哪里?**它们在**……吗?
|
||||
- **Yes, they are.** / **No, they aren't.**
|
||||
**是的,它们在。** / **不,它们不在。**
|
||||
|
||||
**Note (注释):** aren't = are not
|
||||
|
||||
---
|
||||
|
||||
### Task
|
||||
### 任务
|
||||
|
||||
Play a game. Ask your friends questions to find the missing pets.
|
||||
玩游戏。问你的朋友问题来找到失踪的宠物。
|
||||
|
||||
---
|
||||
|
||||
## Page 12: Language Fun
|
||||
## 第12页:语言趣味
|
||||
|
||||
### Play a guessing game.
|
||||
### 玩猜谜游戏。
|
||||
|
||||
**Steps (步骤):**
|
||||
|
||||
**1.** Close your eyes.
|
||||
闭上你的眼睛。
|
||||
|
||||
**2.** Where is the rabbit?
|
||||
兔子在哪里?
|
||||
|
||||
**3.** Is it under a desk?
|
||||
它在桌子下面吗?
|
||||
No, it isn't.
|
||||
不,它不在。
|
||||
|
||||
**4.** Is it in a drawer?
|
||||
它在抽屉里吗?
|
||||
Yes, it is. Well done!
|
||||
是的,它在。做得好!
|
||||
|
||||
**Vocabulary (词汇):**
|
||||
- eyes - 眼睛
|
||||
- desk - 书桌
|
||||
- drawer - 抽屉
|
||||
- well done - 做得好
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
# UNIT 8: Letters Ww Xx Yy Zz
|
||||
# 第8单元:字母 Ww Xx Yy Zz
|
||||
|
||||
## Letter Ww
|
||||
## 字母 Ww
|
||||
|
||||
### Listen and repeat.
|
||||
### 听并跟读。
|
||||
|
||||
**Ww**
|
||||
|
||||
**Key word (关键词):** wise wolf - 聪明的狼
|
||||
|
||||
### Listen, point, and repeat.
|
||||
### 听、指并跟读。
|
||||
|
||||
**Words starting with W (以W开头的单词):**
|
||||
1. wolf - 狼
|
||||
2. web - 网;蜘蛛网
|
||||
3. water - 水
|
||||
4. watch - 手表;观看
|
||||
|
||||
---
|
||||
|
||||
### Trace, write, and say.
|
||||
|
||||
**W** (capital)
|
||||
**w** (lowercase)
|
||||
|
||||
### Listen. Then write Ww or cross it out.
|
||||
|
||||
*[Practice exercise with 6 items]*
|
||||
|
||||
### Listen and chant.
|
||||
|
||||
"Do you see a web?"
|
||||
|
||||
---
|
||||
|
||||
## Letter Xx
|
||||
## 字母 Xx
|
||||
|
||||
### Listen and repeat.
|
||||
### 听并跟读。
|
||||
|
||||
**Xx**
|
||||
|
||||
**Key word (关键词):** fox in a box - 盒子里的狐狸
|
||||
|
||||
### Listen, point, and repeat.
|
||||
### 听、指并跟读。
|
||||
|
||||
**Words with X (含有X的单词):**
|
||||
1. fox - 狐狸
|
||||
2. box - 盒子;箱子
|
||||
3. six - 六
|
||||
4. wax - 蜡
|
||||
|
||||
---
|
||||
|
||||
### Trace, write, and say.
|
||||
|
||||
**X** (capital)
|
||||
**x** (lowercase)
|
||||
|
||||
### Match. Then write Xx.
|
||||
|
||||
1. box
|
||||
2. six (number 6)
|
||||
3. fox
|
||||
4. wax (yellow substance)
|
||||
|
||||
### Listen and chant.
|
||||
|
||||
"Do you see the box?"
|
||||
|
||||
---
|
||||
|
||||
## Letter Yy
|
||||
## 字母 Yy
|
||||
|
||||
### Listen and repeat.
|
||||
### 听并跟读。
|
||||
|
||||
**Yy**
|
||||
|
||||
**Key word (关键词):** yellow yo-yo - 黄色的悠悠球
|
||||
|
||||
### Listen, point, and repeat.
|
||||
### 听、指并跟读。
|
||||
|
||||
**Words starting with Y (以Y开头的单词):**
|
||||
1. yo-yo - 悠悠球
|
||||
2. yak - 牦牛
|
||||
3. yogurt - 酸奶
|
||||
4. yacht - 游艇
|
||||
|
||||
---
|
||||
|
||||
### Trace, write, and say.
|
||||
|
||||
**Y** (capital)
|
||||
**y** (lowercase)
|
||||
|
||||
### Listen and write. Then match.
|
||||
|
||||
**Practice with words:**
|
||||
1. yak
|
||||
2. yo-yo
|
||||
3. yogurt
|
||||
4. yacht
|
||||
5. kite
|
||||
6. yacht
|
||||
|
||||
### Listen and chant.
|
||||
|
||||
"I don't have a yo-yo."
|
||||
|
||||
---
|
||||
|
||||
## Letter Zz
|
||||
|
||||
### Listen and repeat.
|
||||
|
||||
**Zz**
|
||||
|
||||
**Key word:** zigzag zipper
|
||||
|
||||
### Listen, point, and repeat.
|
||||
|
||||
**Words starting with Z:**
|
||||
1. zipper
|
||||
2. zero (number 0)
|
||||
3. zoo
|
||||
4. zebra
|
||||
|
||||
---
|
||||
|
||||
### Trace, write, and say.
|
||||
|
||||
**Z** (capital)
|
||||
**z** (lowercase)
|
||||
|
||||
### Connect. Then write Zz.
|
||||
|
||||
*[Maze activity connecting items that start with Z]*
|
||||
|
||||
### Listen and chant.
|
||||
|
||||
"Do you want a zebra?"
|
||||
|
||||
---
|
||||
|
||||
## Unit 8 Vocabulary Summary
|
||||
## 第8单元词汇总结
|
||||
|
||||
**Ww:** wolf (狼), web (网), water (水), watch (手表)
|
||||
**Xx:** fox (狐狸), box (盒子), six (六), wax (蜡)
|
||||
**Yy:** yo-yo (悠悠球), yak (牦牛), yogurt (酸奶), yacht (游艇)
|
||||
**Zz:** zipper (拉链), zero (零), zoo (动物园), zebra (斑马)
|
||||
|
||||
---
|
||||
|
||||
## Additional Notes
|
||||
## 补充说明
|
||||
|
||||
### Contractions learned (学习的缩写):
|
||||
- isn't = is not (不是)
|
||||
- aren't = are not (不是,复数)
|
||||
- Let's = Let us (让我们)
|
||||
|
||||
### Grammar focus (语法重点):
|
||||
- Where is/are...? (……在哪里?)
|
||||
- Is it / Are they + preposition (in/on/under/near)? (它/它们在……吗?+ 介词)
|
||||
- Yes, it is. / No, it isn't. (是的,它在。/ 不,它不在。)
|
||||
- Yes, they are. / No, they aren't. (是的,它们在。/ 不,它们不在。)
|
||||
692
content/chapters/sbs-2.json
Normal file
692
content/chapters/sbs-2.json
Normal file
@ -0,0 +1,692 @@
|
||||
{
|
||||
"id": "sbs-2",
|
||||
"book_id": "sbs",
|
||||
"name": "Locations & Classrooms",
|
||||
"description": "Side by Side Level 2 - Classroom objects, home locations, and where questions",
|
||||
"difficulty": "beginner",
|
||||
"language": "en-US",
|
||||
"chapter_number": "2",
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2025-10-18",
|
||||
"updated": "2025-10-18",
|
||||
"source": "Side by Side English Learning Series",
|
||||
"target_level": "beginner",
|
||||
"estimated_hours": 15,
|
||||
"prerequisites": ["sbs-1"],
|
||||
"learning_objectives": [
|
||||
"Master classroom object vocabulary",
|
||||
"Learn home and location vocabulary",
|
||||
"Practice 'Where' questions with to be",
|
||||
"Understand subject pronouns and contractions",
|
||||
"Learn greetings and basic conversations"
|
||||
],
|
||||
"content_tags": ["vocabulary", "locations", "classroom", "beginner-english", "where-questions"],
|
||||
"completion_criteria": {
|
||||
"vocabulary_mastery": 80,
|
||||
"quiz_score": 75,
|
||||
"games_completed": 3
|
||||
}
|
||||
},
|
||||
"vocabulary": {
|
||||
"pen": { "user_language": "钢笔", "type": "noun", "pronunciation": "/pen/" },
|
||||
"book": { "user_language": "书", "type": "noun", "pronunciation": "/bʊk/" },
|
||||
"pencil": { "user_language": "铅笔", "type": "noun", "pronunciation": "/ˈpensəl/" },
|
||||
"notebook": { "user_language": "笔记本", "type": "noun", "pronunciation": "/ˈnoʊtbʊk/" },
|
||||
"bookshelf": { "user_language": "书架", "type": "noun", "pronunciation": "/ˈbʊkʃelf/" },
|
||||
"globe": { "user_language": "地球仪;地球;世界", "type": "noun", "pronunciation": "/ɡloʊb/" },
|
||||
"map": { "user_language": "地图", "type": "noun", "pronunciation": "/mæp/" },
|
||||
"board": { "user_language": "黑板", "type": "noun", "pronunciation": "/bɔːrd/" },
|
||||
"wall": { "user_language": "墙", "type": "noun", "pronunciation": "/wɔːl/" },
|
||||
"clock": { "user_language": "时钟,钟", "type": "noun", "pronunciation": "/klɑːk/" },
|
||||
"bulletin board": { "user_language": "布告栏,公告板", "type": "noun", "pronunciation": "/ˈbʊlətɪn bɔːrd/" },
|
||||
"computer": { "user_language": "计算机,电脑", "type": "noun", "pronunciation": "/kəmˈpjuːtər/" },
|
||||
"table": { "user_language": "桌子", "type": "noun", "pronunciation": "/ˈteɪbəl/" },
|
||||
"chair": { "user_language": "椅子", "type": "noun", "pronunciation": "/tʃer/" },
|
||||
"ruler": { "user_language": "尺子", "type": "noun", "pronunciation": "/ˈruːlər/" },
|
||||
"desk": { "user_language": "书桌;办公桌", "type": "noun", "pronunciation": "/desk/" },
|
||||
"dictionary": { "user_language": "词典,字典", "type": "noun", "pronunciation": "/ˈdɪkʃəneri/" },
|
||||
"living room": { "user_language": "客厅;起居室", "type": "noun", "pronunciation": "/ˈlɪvɪŋ ruːm/" },
|
||||
"dining room": { "user_language": "餐厅;饭厅", "type": "noun", "pronunciation": "/ˈdaɪnɪŋ ruːm/" },
|
||||
"kitchen": { "user_language": "厨房", "type": "noun", "pronunciation": "/ˈkɪtʃɪn/" },
|
||||
"bedroom": { "user_language": "卧室", "type": "noun", "pronunciation": "/ˈbedruːm/" },
|
||||
"bathroom": { "user_language": "浴室;洗手间", "type": "noun", "pronunciation": "/ˈbæθruːm/" },
|
||||
"attic": { "user_language": "阁楼,顶楼", "type": "noun", "pronunciation": "/ˈætɪk/" },
|
||||
"yard": { "user_language": "院子;场地", "type": "noun", "pronunciation": "/jɑːrd/" },
|
||||
"garage": { "user_language": "车库", "type": "noun", "pronunciation": "/ɡəˈrɑːʒ/" },
|
||||
"basement": { "user_language": "地下室", "type": "noun", "pronunciation": "/ˈbeɪsmənt/" },
|
||||
"bank": { "user_language": "银行", "type": "noun", "pronunciation": "/bæŋk/" },
|
||||
"hospital": { "user_language": "医院", "type": "noun", "pronunciation": "/ˈhɑːspɪtl/" },
|
||||
"library": { "user_language": "图书馆", "type": "noun", "pronunciation": "/ˈlaɪbreri/" },
|
||||
"movie theater": { "user_language": "电影院", "type": "noun", "pronunciation": "/ˈmuːvi ˈθiːətər/" },
|
||||
"park": { "user_language": "公园", "type": "noun", "pronunciation": "/pɑːrk/" },
|
||||
"post office": { "user_language": "邮局", "type": "noun", "pronunciation": "/poʊst ˈɔːfɪs/" },
|
||||
"restaurant": { "user_language": "餐馆;饭店", "type": "noun", "pronunciation": "/ˈrestrɑːnt/" },
|
||||
"supermarket": { "user_language": "超市", "type": "noun", "pronunciation": "/ˈsuːpərmɑːrkɪt/" },
|
||||
"zoo": { "user_language": "动物园", "type": "noun", "pronunciation": "/zuː/" },
|
||||
"absent": { "user_language": "缺席的", "type": "adjective", "pronunciation": "/ˈæbsənt/" },
|
||||
"dentist": { "user_language": "牙科医生", "type": "noun", "pronunciation": "/ˈdentɪst/" },
|
||||
"social security office": { "user_language": "社会保障办公室", "type": "noun", "pronunciation": "/ˈsoʊʃəl sɪˈkjʊrəti ˈɔːfɪs/" },
|
||||
"shame": { "user_language": "羞耻,羞愧;憾事", "type": "noun", "pronunciation": "/ʃeɪm/" },
|
||||
"except": { "user_language": "除了", "type": "preposition", "pronunciation": "/ɪkˈsept/" },
|
||||
"everybody": { "user_language": "每个人,所有人", "type": "pronoun", "pronunciation": "/ˈevribɑːdi/" },
|
||||
"interesting": { "user_language": "有趣的,有意思的", "type": "adjective", "pronunciation": "/ˈɪntrəstɪŋ/" },
|
||||
"different": { "user_language": "不同的", "type": "adjective", "pronunciation": "/ˈdɪfrənt/" },
|
||||
"countries": { "user_language": "国家(复数)", "type": "noun", "pronunciation": "/ˈkʌntriz/" },
|
||||
"Chinese": { "user_language": "中国的;中国人", "type": "adjective/noun", "pronunciation": "/tʃaɪˈniːz/" },
|
||||
"Japanese": { "user_language": "日本的;日本人", "type": "adjective/noun", "pronunciation": "/ˌdʒæpəˈniːz/" },
|
||||
"Korean": { "user_language": "韩国的;韩国人", "type": "adjective/noun", "pronunciation": "/kəˈriən/" },
|
||||
"Italian": { "user_language": "意大利的;意大利人", "type": "adjective/noun", "pronunciation": "/ɪˈtæljən/" },
|
||||
"Mexican": { "user_language": "墨西哥的;墨西哥人", "type": "adjective/noun", "pronunciation": "/ˈmeksɪkən/" },
|
||||
"Greek": { "user_language": "希腊的;希腊人", "type": "adjective/noun", "pronunciation": "/ɡriːk/" },
|
||||
"Puerto Rican": { "user_language": "波多黎各的;波多黎各人", "type": "adjective/noun", "pronunciation": "/ˌpwertə ˈriːkən/" }
|
||||
},
|
||||
"phrases": {
|
||||
"Where's the book?": { "user_language": "书在哪里?", "context": "location-question", "pronunciation": "/werz ðə bʊk/" },
|
||||
"It's on the desk": { "user_language": "它在桌子上。", "context": "location-answer", "pronunciation": "/ɪts ɑːn ðə desk/" },
|
||||
"Where are you?": { "user_language": "你在哪里?", "context": "location-question", "pronunciation": "/wer ɑːr juː/" },
|
||||
"I'm in the kitchen": { "user_language": "我在厨房。", "context": "location-answer", "pronunciation": "/aɪm ɪn ðə ˈkɪtʃɪn/" },
|
||||
"We're in the living room": { "user_language": "我们在客厅。", "context": "location-answer", "pronunciation": "/wir ɪn ðə ˈlɪvɪŋ ruːm/" },
|
||||
"They're in the yard": { "user_language": "他们在院子里。", "context": "location-answer", "pronunciation": "/ðer ɪn ðə jɑːrd/" },
|
||||
"He's in the living room": { "user_language": "他在客厅。", "context": "location-answer", "pronunciation": "/hiːz ɪn ðə ˈlɪvɪŋ ruːm/" },
|
||||
"She's in the bedroom": { "user_language": "她在卧室。", "context": "location-answer", "pronunciation": "/ʃiːz ɪn ðə ˈbedruːm/" },
|
||||
"It's in the garage": { "user_language": "它在车库里。", "context": "location-answer", "pronunciation": "/ɪts ɪn ðə ɡəˈrɑːʒ/" },
|
||||
"Hi. How are you?": { "user_language": "嗨,你好吗?", "context": "greeting", "pronunciation": "/haɪ haʊ ɑːr juː/" },
|
||||
"Fine. And you?": { "user_language": "很好。你呢?", "context": "greeting-response", "pronunciation": "/faɪn ænd juː/" },
|
||||
"Fine, thanks": { "user_language": "很好,谢谢", "context": "greeting-response", "pronunciation": "/faɪn θæŋks/" },
|
||||
"What a shame!": { "user_language": "真遗憾!", "context": "expression", "pronunciation": "/wʌt ə ʃeɪm/" },
|
||||
"Everybody except me": { "user_language": "除了我之外的所有人", "context": "expression", "pronunciation": "/ˈevribɑːdi ɪkˈsept miː/" }
|
||||
},
|
||||
"dialogs": {
|
||||
"classroom_location": {
|
||||
"title": "Where Is It?",
|
||||
"participants": ["Student A", "Student B"],
|
||||
"lines": [
|
||||
{ "speaker": "Student A", "text": "Where's the book?", "user_language": "书在哪里?" },
|
||||
{ "speaker": "Student B", "text": "It's on the desk.", "user_language": "它在桌子上。" },
|
||||
{ "speaker": "Student A", "text": "Where's the map?", "user_language": "地图在哪里?" },
|
||||
{ "speaker": "Student B", "text": "It's on the wall.", "user_language": "它在墙上。" },
|
||||
{ "speaker": "Student A", "text": "Where's the computer?", "user_language": "电脑在哪里?" },
|
||||
{ "speaker": "Student B", "text": "It's on the table.", "user_language": "它在桌子上。" }
|
||||
]
|
||||
},
|
||||
"home_location": {
|
||||
"title": "Where Are You?",
|
||||
"participants": ["Person A", "Person B"],
|
||||
"lines": [
|
||||
{ "speaker": "Person A", "text": "Where are you?", "user_language": "你在哪里?" },
|
||||
{ "speaker": "Person B", "text": "I'm in the kitchen.", "user_language": "我在厨房。" },
|
||||
{ "speaker": "Person A", "text": "Where are you?", "user_language": "你们在哪里?" },
|
||||
{ "speaker": "Person B", "text": "We're in the living room.", "user_language": "我们在客厅。" },
|
||||
{ "speaker": "Person A", "text": "Where are Mr. and Mrs. Jones?", "user_language": "琼斯先生和太太在哪里?" },
|
||||
{ "speaker": "Person B", "text": "They're in the yard.", "user_language": "他们在院子里。" }
|
||||
]
|
||||
},
|
||||
"people_location": {
|
||||
"title": "Where's Bob?",
|
||||
"participants": ["Person A", "Person B"],
|
||||
"lines": [
|
||||
{ "speaker": "Person A", "text": "Where's Bob?", "user_language": "鲍勃在哪里?" },
|
||||
{ "speaker": "Person B", "text": "He's in the living room.", "user_language": "他在客厅。" },
|
||||
{ "speaker": "Person A", "text": "Where's Mary?", "user_language": "玛丽在哪里?" },
|
||||
{ "speaker": "Person B", "text": "She's in the bedroom.", "user_language": "她在卧室。" },
|
||||
{ "speaker": "Person A", "text": "Where's the car?", "user_language": "车在哪里?" },
|
||||
{ "speaker": "Person B", "text": "It's in the garage.", "user_language": "它在车库里。" }
|
||||
]
|
||||
},
|
||||
"greeting": {
|
||||
"title": "Greeting People",
|
||||
"participants": ["Person A", "Person B"],
|
||||
"lines": [
|
||||
{ "speaker": "Person A", "text": "Hi. How are you?", "user_language": "嗨,你好吗?" },
|
||||
{ "speaker": "Person B", "text": "Fine. And you?", "user_language": "很好。你呢?" },
|
||||
{ "speaker": "Person A", "text": "Fine, thanks.", "user_language": "很好,谢谢。" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"texts": [
|
||||
{
|
||||
"title": "The Students in My English Class",
|
||||
"original_language": "The students in my English class are very interesting. Henry is Chinese. He's from Shanghai. Linda is Puerto Rican. She's from San Juan. Mr. and Mrs. Kim are Korean. They're from Seoul. George is Greek. He's from Athens. Carla is Italian. She's from Rome. Mr. and Mrs. Sato are Japanese. They're from Tokyo. My friend Maria and I are Mexican. We're from Mexico City. Yes, the students in my English class are very interesting. We're from many different countries . . . and we're friends.",
|
||||
"user_language": "我英语班的学生非常有趣。亨利是中国人。他来自上海。琳达是波多黎各人。她来自圣胡安。金先生和太太是韩国人。他们来自首尔。乔治是希腊人。他来自雅典。卡拉是意大利人。她来自罗马。佐藤先生和太太是日本人。他们来自东京。我的朋友玛丽亚和我是墨西哥人。我们来自墨西哥城。是的,我英语班的学生非常有趣。我们来自许多不同的国家……而且我们是朋友。"
|
||||
},
|
||||
{
|
||||
"title": "All the Students in My English Class Are Absent Today",
|
||||
"original_language": "All the students in my English class are absent today. George is absent. He's in the hospital. Maria is absent. She's at the dentist. Mr. and Mrs. Sato are absent. They're at the social security office. Even our English teacher is absent. He's home in bed! What a shame! Everybody in my English class is absent today. Everybody except me.",
|
||||
"user_language": "今天我英语班的所有学生都缺席了。乔治缺席了。他在医院。玛丽亚缺席了。她在看牙医。佐藤先生和太太缺席了。他们在社会保障办公室。甚至我们的英语老师也缺席了。他在家卧床休息!真遗憾!今天我英语班的所有人都缺席了。除了我之外的所有人。"
|
||||
}
|
||||
],
|
||||
"grammar": {
|
||||
"where-questions": {
|
||||
"title": "Where Questions with To Be",
|
||||
"explanation": "Use 'Where' to ask about location. Combine with am/is/are depending on the subject.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "Where is the book? / Where's the book?",
|
||||
"translation": "书在哪里?",
|
||||
"explanation": "Use 'is' for singular subjects (the book). 'Where's' is the contraction."
|
||||
},
|
||||
{
|
||||
"english": "Where are you?",
|
||||
"translation": "你在哪里?",
|
||||
"explanation": "Use 'are' with 'you' (singular or plural)"
|
||||
},
|
||||
{
|
||||
"english": "Where are they?",
|
||||
"translation": "他们在哪里?",
|
||||
"explanation": "Use 'are' for plural subjects (they)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"subject-pronouns": {
|
||||
"title": "Subject Pronouns with To Be",
|
||||
"explanation": "Subject pronouns replace names. Use the correct form of 'be' with each pronoun.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "I am / I'm",
|
||||
"translation": "我是 / 我在",
|
||||
"explanation": "Use 'am' only with 'I'. Contraction: I'm"
|
||||
},
|
||||
{
|
||||
"english": "He is / He's, She is / She's, It is / It's",
|
||||
"translation": "他是/他在,她是/她在,它是/它在",
|
||||
"explanation": "Use 'is' with he, she, it. Contractions: He's, She's, It's"
|
||||
},
|
||||
{
|
||||
"english": "We are / We're, You are / You're, They are / They're",
|
||||
"translation": "我们是/我们在,你们是/你们在,他们是/他们在",
|
||||
"explanation": "Use 'are' with we, you, they. Contractions: We're, You're, They're"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prepositions-location": {
|
||||
"title": "Prepositions of Location",
|
||||
"explanation": "Use 'on' for surfaces, 'in' for enclosed spaces, 'at' for specific locations.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "The book is on the desk",
|
||||
"translation": "书在桌子上",
|
||||
"explanation": "Use 'on' for objects resting on a surface"
|
||||
},
|
||||
{
|
||||
"english": "I'm in the kitchen",
|
||||
"translation": "我在厨房",
|
||||
"explanation": "Use 'in' for being inside a room or enclosed space"
|
||||
},
|
||||
{
|
||||
"english": "She's at the dentist",
|
||||
"translation": "她在看牙医",
|
||||
"explanation": "Use 'at' for specific locations or places you visit"
|
||||
}
|
||||
]
|
||||
},
|
||||
"nationalities": {
|
||||
"title": "Nationalities and Countries",
|
||||
"explanation": "Use nationality adjectives to describe where people are from. They can be both adjectives and nouns.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "Henry is Chinese. He's from Shanghai.",
|
||||
"translation": "亨利是中国人。他来自上海。",
|
||||
"explanation": "'Chinese' can be an adjective or noun. Use 'from' to indicate city/country of origin."
|
||||
},
|
||||
{
|
||||
"english": "We're from many different countries",
|
||||
"translation": "我们来自许多不同的国家",
|
||||
"explanation": "Use 'from' + country/city to show origin"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"fillInBlanks": [
|
||||
{
|
||||
"sentence": "Where ___ the book?",
|
||||
"options": ["is", "are", "am", "be"],
|
||||
"correctAnswer": "is",
|
||||
"explanation": "Use 'is' with singular subjects like 'the book'",
|
||||
"grammarFocus": "where-questions"
|
||||
},
|
||||
{
|
||||
"sentence": "It's ___ the desk",
|
||||
"options": ["on", "in", "at", "to"],
|
||||
"correctAnswer": "on",
|
||||
"explanation": "Use 'on' for objects resting on a surface",
|
||||
"grammarFocus": "prepositions-location"
|
||||
},
|
||||
{
|
||||
"sentence": "Where ___ you?",
|
||||
"options": ["are", "is", "am", "be"],
|
||||
"correctAnswer": "are",
|
||||
"explanation": "Always use 'are' with 'you'",
|
||||
"grammarFocus": "where-questions"
|
||||
},
|
||||
{
|
||||
"sentence": "I'm ___ the kitchen",
|
||||
"options": ["in", "on", "at", "to"],
|
||||
"correctAnswer": "in",
|
||||
"explanation": "Use 'in' for being inside a room",
|
||||
"grammarFocus": "prepositions-location"
|
||||
},
|
||||
{
|
||||
"sentence": "They're ___ the yard",
|
||||
"options": ["in", "on", "at", "to"],
|
||||
"correctAnswer": "in",
|
||||
"explanation": "Use 'in' for being inside an enclosed space like a yard",
|
||||
"grammarFocus": "prepositions-location"
|
||||
},
|
||||
{
|
||||
"sentence": "The ___ is on the wall",
|
||||
"options": ["map", "computer", "book", "pen"],
|
||||
"correctAnswer": "map",
|
||||
"explanation": "Maps are typically hung on walls",
|
||||
"grammarFocus": "classroom-vocabulary"
|
||||
},
|
||||
{
|
||||
"sentence": "Where's the ___? It's in the garage",
|
||||
"options": ["car", "book", "pen", "clock"],
|
||||
"correctAnswer": "car",
|
||||
"explanation": "Cars are kept in garages",
|
||||
"grammarFocus": "location-vocabulary"
|
||||
},
|
||||
{
|
||||
"sentence": "Henry is ___. He's from Shanghai",
|
||||
"options": ["Chinese", "Korean", "Japanese", "Greek"],
|
||||
"correctAnswer": "Chinese",
|
||||
"explanation": "Shanghai is a city in China, so Henry is Chinese",
|
||||
"grammarFocus": "nationalities"
|
||||
},
|
||||
{
|
||||
"sentence": "We're from many different ___",
|
||||
"options": ["countries", "country", "city", "cities"],
|
||||
"correctAnswer": "countries",
|
||||
"explanation": "Use plural 'countries' after 'many'",
|
||||
"grammarFocus": "nationalities"
|
||||
},
|
||||
{
|
||||
"sentence": "All the students are ___ today",
|
||||
"options": ["absent", "interesting", "different", "convenient"],
|
||||
"correctAnswer": "absent",
|
||||
"explanation": "'Absent' means not present or not in class",
|
||||
"grammarFocus": "vocabulary"
|
||||
},
|
||||
{
|
||||
"sentence": "She's at the ___",
|
||||
"options": ["dentist", "bedroom", "kitchen", "yard"],
|
||||
"correctAnswer": "dentist",
|
||||
"explanation": "Use 'at the dentist' to mean visiting the dentist's office",
|
||||
"grammarFocus": "location-vocabulary"
|
||||
},
|
||||
{
|
||||
"sentence": "The ___ is on the desk",
|
||||
"options": ["pen", "map", "clock", "globe"],
|
||||
"correctAnswer": "pen",
|
||||
"explanation": "Pens are commonly placed on desks",
|
||||
"grammarFocus": "classroom-vocabulary"
|
||||
},
|
||||
{
|
||||
"sentence": "___ a shame! Everybody is absent",
|
||||
"options": ["What", "How", "Where", "Who"],
|
||||
"correctAnswer": "What",
|
||||
"explanation": "Use 'What a shame!' as an expression of disappointment",
|
||||
"grammarFocus": "expressions"
|
||||
},
|
||||
{
|
||||
"sentence": "Everybody except ___",
|
||||
"options": ["me", "I", "my", "mine"],
|
||||
"correctAnswer": "me",
|
||||
"explanation": "Use object pronoun 'me' after 'except'",
|
||||
"grammarFocus": "pronouns"
|
||||
},
|
||||
{
|
||||
"sentence": "The students in my class are very ___",
|
||||
"options": ["interesting", "interested", "interest", "interests"],
|
||||
"correctAnswer": "interesting",
|
||||
"explanation": "Use 'interesting' to describe something/someone that creates interest",
|
||||
"grammarFocus": "adjectives"
|
||||
}
|
||||
],
|
||||
"corrections": [
|
||||
{
|
||||
"correct": "Where is the book?",
|
||||
"incorrect": "Where the book is?",
|
||||
"explanation": "In questions, put the verb (is) before the subject (the book) after the question word",
|
||||
"grammarFocus": "question-formation"
|
||||
},
|
||||
{
|
||||
"correct": "It's on the desk",
|
||||
"incorrect": "It on the desk",
|
||||
"explanation": "Always include the verb 'is' (or contraction 'It's') in complete sentences",
|
||||
"grammarFocus": "to-be"
|
||||
},
|
||||
{
|
||||
"correct": "I'm in the kitchen",
|
||||
"incorrect": "I'm in kitchen",
|
||||
"explanation": "Use 'the' before specific room names",
|
||||
"grammarFocus": "articles"
|
||||
},
|
||||
{
|
||||
"correct": "Where are you?",
|
||||
"incorrect": "Where is you?",
|
||||
"explanation": "Always use 'are' with 'you', never 'is'",
|
||||
"grammarFocus": "subject-verb-agreement"
|
||||
},
|
||||
{
|
||||
"correct": "They're in the yard",
|
||||
"incorrect": "They in the yard",
|
||||
"explanation": "Include the verb 'are' (or contraction 'They're')",
|
||||
"grammarFocus": "to-be"
|
||||
},
|
||||
{
|
||||
"correct": "We're from many different countries",
|
||||
"incorrect": "We're from many different country",
|
||||
"explanation": "Use plural 'countries' after 'many'",
|
||||
"grammarFocus": "plurals"
|
||||
},
|
||||
{
|
||||
"correct": "Henry is Chinese",
|
||||
"incorrect": "Henry is China",
|
||||
"explanation": "Use the nationality adjective 'Chinese', not the country name 'China'",
|
||||
"grammarFocus": "nationalities"
|
||||
},
|
||||
{
|
||||
"correct": "He's from Shanghai",
|
||||
"incorrect": "He from Shanghai",
|
||||
"explanation": "Include the verb 'is' (or contraction 'He's') before 'from'",
|
||||
"grammarFocus": "to-be"
|
||||
},
|
||||
{
|
||||
"correct": "What a shame!",
|
||||
"incorrect": "What shame!",
|
||||
"explanation": "Use the article 'a' in this expression: 'What a shame!'",
|
||||
"grammarFocus": "expressions"
|
||||
},
|
||||
{
|
||||
"correct": "Everybody except me",
|
||||
"incorrect": "Everybody except I",
|
||||
"explanation": "Use the object pronoun 'me' after the preposition 'except'",
|
||||
"grammarFocus": "pronouns"
|
||||
}
|
||||
],
|
||||
"exercises": {
|
||||
"classroom_objects": {
|
||||
"type": "location_practice",
|
||||
"instructions": "Ask and answer: Where's the [object]?",
|
||||
"items": [
|
||||
{ "question": "Where's the pen?", "answer": "It's on the desk.", "user_language_q": "钢笔在哪里?", "user_language_a": "它在桌子上。" },
|
||||
{ "question": "Where's the board?", "answer": "It's on the wall.", "user_language_q": "黑板在哪里?", "user_language_a": "它在墙上。" },
|
||||
{ "question": "Where's the globe?", "answer": "It's on the table.", "user_language_q": "地球仪在哪里?", "user_language_a": "它在桌子上。" },
|
||||
{ "question": "Where's the ruler?", "answer": "It's on the desk.", "user_language_q": "尺子在哪里?", "user_language_a": "它在桌子上。" },
|
||||
{ "question": "Where's the clock?", "answer": "It's on the wall.", "user_language_q": "时钟在哪里?", "user_language_a": "它在墙上。" }
|
||||
]
|
||||
},
|
||||
"people_locations": {
|
||||
"type": "location_practice",
|
||||
"instructions": "Ask and answer: Where are [people]?",
|
||||
"items": [
|
||||
{ "question": "Where's Albert?", "location": "restaurant", "answer": "He's at the restaurant.", "user_language_q": "阿尔伯特在哪里?", "user_language_a": "他在餐馆。" },
|
||||
{ "question": "Where's Carmen?", "location": "bank", "answer": "She's at the bank.", "user_language_q": "卡门在哪里?", "user_language_a": "她在银行。" },
|
||||
{ "question": "Where are Walter and Mary?", "location": "supermarket", "answer": "They're at the supermarket.", "user_language_q": "沃尔特和玛丽在哪里?", "user_language_a": "他们在超市。" },
|
||||
{ "question": "Where's Kate?", "location": "movie theater", "answer": "She's at the movie theater.", "user_language_q": "凯特在哪里?", "user_language_a": "她在电影院。" },
|
||||
{ "question": "Where are Mr. and Mrs. Lee?", "location": "post office", "answer": "They're at the post office.", "user_language_q": "李先生和太太在哪里?", "user_language_a": "他们在邮局。" }
|
||||
]
|
||||
},
|
||||
"reading_check": {
|
||||
"type": "true_false",
|
||||
"instructions": "The Students in My English Class - True or False?",
|
||||
"items": [
|
||||
{ "statement": "Linda is Korean", "answer": false, "user_language": "琳达是韩国人" },
|
||||
{ "statement": "George is Greek", "answer": true, "user_language": "乔治是希腊人" },
|
||||
{ "statement": "Henry is from Mexico City", "answer": false, "user_language": "亨利来自墨西哥城" },
|
||||
{ "statement": "Mr. Kim is from Seoul", "answer": true, "user_language": "金先生来自首尔" },
|
||||
{ "statement": "Carla is Chinese", "answer": false, "user_language": "卡拉是中国人" },
|
||||
{ "statement": "The students in the class are from many countries", "answer": true, "user_language": "班上的学生来自许多国家" }
|
||||
]
|
||||
},
|
||||
"reading_check_2": {
|
||||
"type": "true_false",
|
||||
"instructions": "All the Students Are Absent - True or False?",
|
||||
"items": [
|
||||
{ "statement": "George is absent", "answer": true, "user_language": "乔治缺席了" },
|
||||
{ "statement": "Maria is absent", "answer": true, "user_language": "玛丽亚缺席了" },
|
||||
{ "statement": "Mr. and Mrs. Sato are absent", "answer": true, "user_language": "佐藤先生和太太缺席了" },
|
||||
{ "statement": "The English teacher is absent", "answer": true, "user_language": "英语老师缺席了" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"thematic_questions": {
|
||||
"classroom_objects": [
|
||||
{
|
||||
"id": "q1",
|
||||
"question": "Where's the book?",
|
||||
"question_user_language": "书在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It's on the desk",
|
||||
"The book is on the desk",
|
||||
"On the desk"
|
||||
],
|
||||
"theme": "classroom_objects"
|
||||
},
|
||||
{
|
||||
"id": "q2",
|
||||
"question": "Where's the map?",
|
||||
"question_user_language": "地图在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It's on the wall",
|
||||
"The map is on the wall",
|
||||
"On the wall"
|
||||
],
|
||||
"theme": "classroom_objects"
|
||||
},
|
||||
{
|
||||
"id": "q3",
|
||||
"question": "Where's the clock?",
|
||||
"question_user_language": "时钟在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It's on the wall",
|
||||
"The clock is on the wall",
|
||||
"On the wall"
|
||||
],
|
||||
"theme": "classroom_objects"
|
||||
},
|
||||
{
|
||||
"id": "q4",
|
||||
"question": "Where's the computer?",
|
||||
"question_user_language": "电脑在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It's on the table",
|
||||
"The computer is on the table",
|
||||
"On the table"
|
||||
],
|
||||
"theme": "classroom_objects"
|
||||
},
|
||||
{
|
||||
"id": "q5",
|
||||
"question": "Where's the globe?",
|
||||
"question_user_language": "地球仪在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It's on the desk",
|
||||
"The globe is on the desk",
|
||||
"On the bookshelf"
|
||||
],
|
||||
"theme": "classroom_objects"
|
||||
}
|
||||
],
|
||||
"rooms_and_locations": [
|
||||
{
|
||||
"id": "q6",
|
||||
"question": "Where are you?",
|
||||
"question_user_language": "你在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"I'm in the kitchen",
|
||||
"I'm in the living room",
|
||||
"I'm in the bedroom"
|
||||
],
|
||||
"theme": "rooms_and_locations"
|
||||
},
|
||||
{
|
||||
"id": "q7",
|
||||
"question": "Where are Mr. and Mrs. Jones?",
|
||||
"question_user_language": "琼斯先生和太太在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"They're in the yard",
|
||||
"They're in the living room",
|
||||
"They're in the dining room"
|
||||
],
|
||||
"theme": "rooms_and_locations"
|
||||
},
|
||||
{
|
||||
"id": "q8",
|
||||
"question": "Where are you and your friend?",
|
||||
"question_user_language": "你和你的朋友在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"We're in the park",
|
||||
"We're in the library",
|
||||
"We're at home"
|
||||
],
|
||||
"theme": "rooms_and_locations"
|
||||
},
|
||||
{
|
||||
"id": "q9",
|
||||
"question": "Where's the car?",
|
||||
"question_user_language": "车在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It's in the garage",
|
||||
"The car is in the garage",
|
||||
"In the garage"
|
||||
],
|
||||
"theme": "rooms_and_locations"
|
||||
},
|
||||
{
|
||||
"id": "q10",
|
||||
"question": "Where are the students?",
|
||||
"question_user_language": "学生们在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"They're in the classroom",
|
||||
"They're at school",
|
||||
"They're in the library"
|
||||
],
|
||||
"theme": "rooms_and_locations"
|
||||
}
|
||||
],
|
||||
"people_locations": [
|
||||
{
|
||||
"id": "q11",
|
||||
"question": "Where's Bob?",
|
||||
"question_user_language": "鲍勃在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's in the living room",
|
||||
"He's at home",
|
||||
"He's in the kitchen"
|
||||
],
|
||||
"theme": "people_locations"
|
||||
},
|
||||
{
|
||||
"id": "q12",
|
||||
"question": "Where's Mary?",
|
||||
"question_user_language": "玛丽在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"She's in the bedroom",
|
||||
"She's at the library",
|
||||
"She's in the bathroom"
|
||||
],
|
||||
"theme": "people_locations"
|
||||
},
|
||||
{
|
||||
"id": "q13",
|
||||
"question": "Where's your English teacher?",
|
||||
"question_user_language": "你的英语老师在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's in the hospital",
|
||||
"She's at home",
|
||||
"He's in bed"
|
||||
],
|
||||
"theme": "people_locations"
|
||||
},
|
||||
{
|
||||
"id": "q14",
|
||||
"question": "Where are Walter and Mary?",
|
||||
"question_user_language": "沃尔特和玛丽在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"They're at the supermarket",
|
||||
"They're at the bank",
|
||||
"They're in the park"
|
||||
],
|
||||
"theme": "people_locations"
|
||||
}
|
||||
],
|
||||
"nationalities": [
|
||||
{
|
||||
"id": "q15",
|
||||
"question": "Where's Henry from?",
|
||||
"question_user_language": "亨利来自哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's from Shanghai",
|
||||
"He's from China",
|
||||
"Shanghai"
|
||||
],
|
||||
"theme": "nationalities"
|
||||
},
|
||||
{
|
||||
"id": "q16",
|
||||
"question": "What nationality is George?",
|
||||
"question_user_language": "乔治是什么国籍?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's Greek",
|
||||
"George is Greek",
|
||||
"Greek"
|
||||
],
|
||||
"theme": "nationalities"
|
||||
},
|
||||
{
|
||||
"id": "q17",
|
||||
"question": "Where are Mr. and Mrs. Kim from?",
|
||||
"question_user_language": "金先生和太太来自哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"They're from Seoul",
|
||||
"They're from Korea",
|
||||
"Seoul"
|
||||
],
|
||||
"theme": "nationalities"
|
||||
},
|
||||
{
|
||||
"id": "q18",
|
||||
"question": "What nationality is Carla?",
|
||||
"question_user_language": "卡拉是什么国籍?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"She's Italian",
|
||||
"Carla is Italian",
|
||||
"Italian"
|
||||
],
|
||||
"theme": "nationalities"
|
||||
}
|
||||
]
|
||||
},
|
||||
"statistics": {
|
||||
"vocabulary_count": 49,
|
||||
"phrases_count": 14,
|
||||
"dialogs_count": 4,
|
||||
"texts_count": 2,
|
||||
"exercises_count": 4,
|
||||
"fillInBlanks_count": 15,
|
||||
"corrections_count": 10,
|
||||
"thematic_questions_count": 18,
|
||||
"estimated_completion_time": 15
|
||||
}
|
||||
}
|
||||
757
content/chapters/sbs-3.json
Normal file
757
content/chapters/sbs-3.json
Normal file
@ -0,0 +1,757 @@
|
||||
{
|
||||
"id": "sbs-3",
|
||||
"book_id": "sbs",
|
||||
"name": "Present Continuous Tense",
|
||||
"description": "Side by Side Level 3 - Everyday activities and present continuous tense",
|
||||
"difficulty": "beginner",
|
||||
"language": "en-US",
|
||||
"chapter_number": "3",
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2025-10-18",
|
||||
"updated": "2025-10-18",
|
||||
"source": "Side by Side English Learning Series",
|
||||
"target_level": "beginner",
|
||||
"estimated_hours": 18,
|
||||
"prerequisites": ["sbs-2"],
|
||||
"learning_objectives": [
|
||||
"Master present continuous tense formation",
|
||||
"Learn everyday activity vocabulary",
|
||||
"Practice What are you doing questions",
|
||||
"Understand verb -ing forms",
|
||||
"Learn to describe ongoing actions"
|
||||
],
|
||||
"content_tags": ["grammar", "present-continuous", "activities", "beginner-english", "daily-activities"],
|
||||
"completion_criteria": {
|
||||
"vocabulary_mastery": 80,
|
||||
"quiz_score": 75,
|
||||
"games_completed": 3
|
||||
}
|
||||
},
|
||||
"vocabulary": {
|
||||
"eating": { "user_language": "吃", "type": "verb-ing", "pronunciation": "/ˈiːtɪŋ/" },
|
||||
"drinking": { "user_language": "喝", "type": "verb-ing", "pronunciation": "/ˈdrɪŋkɪŋ/" },
|
||||
"cooking": { "user_language": "做饭", "type": "verb-ing", "pronunciation": "/ˈkʊkɪŋ/" },
|
||||
"reading": { "user_language": "读,阅读", "type": "verb-ing", "pronunciation": "/ˈriːdɪŋ/" },
|
||||
"studying": { "user_language": "学习", "type": "verb-ing", "pronunciation": "/ˈstʌdiɪŋ/" },
|
||||
"teaching": { "user_language": "教学", "type": "verb-ing", "pronunciation": "/ˈtiːtʃɪŋ/" },
|
||||
"singing": { "user_language": "唱歌", "type": "verb-ing", "pronunciation": "/ˈsɪŋɪŋ/" },
|
||||
"sleeping": { "user_language": "睡觉", "type": "verb-ing", "pronunciation": "/ˈsliːpɪŋ/" },
|
||||
"swimming": { "user_language": "游泳", "type": "verb-ing", "pronunciation": "/ˈswɪmɪŋ/" },
|
||||
"planting": { "user_language": "种植", "type": "verb-ing", "pronunciation": "/ˈplæntɪŋ/" },
|
||||
"watching TV": { "user_language": "看电视", "type": "verb-ing phrase", "pronunciation": "/ˈwɑːtʃɪŋ ˌtiːˈviː/" },
|
||||
"listening to music": { "user_language": "听音乐", "type": "verb-ing phrase", "pronunciation": "/ˈlɪsənɪŋ tuː ˈmjuːzɪk/" },
|
||||
"playing cards": { "user_language": "打牌", "type": "verb-ing phrase", "pronunciation": "/ˈpleɪɪŋ kɑːrdz/" },
|
||||
"playing baseball": { "user_language": "打棒球", "type": "verb-ing phrase", "pronunciation": "/ˈpleɪɪŋ ˈbeɪsbɔːl/" },
|
||||
"playing the piano": { "user_language": "弹钢琴", "type": "verb-ing phrase", "pronunciation": "/ˈpleɪɪŋ ðə piˈænoʊ/" },
|
||||
"playing the guitar": { "user_language": "弹吉他", "type": "verb-ing phrase", "pronunciation": "/ˈpleɪɪŋ ðə ɡɪˈtɑːr/" },
|
||||
"breakfast": { "user_language": "早餐", "type": "noun", "pronunciation": "/ˈbrekfəst/" },
|
||||
"lunch": { "user_language": "午餐", "type": "noun", "pronunciation": "/lʌntʃ/" },
|
||||
"dinner": { "user_language": "晚餐", "type": "noun", "pronunciation": "/ˈdɪnər/" },
|
||||
"newspaper": { "user_language": "报纸", "type": "noun", "pronunciation": "/ˈnuːzpeɪpər/" },
|
||||
"radio": { "user_language": "收音机", "type": "noun", "pronunciation": "/ˈreɪdioʊ/" },
|
||||
"lemonade": { "user_language": "柠檬水", "type": "noun", "pronunciation": "/ˌleməˈneɪd/" },
|
||||
"milk": { "user_language": "牛奶", "type": "noun", "pronunciation": "/mɪlk/" },
|
||||
"flowers": { "user_language": "花", "type": "noun", "pronunciation": "/ˈflaʊərz/" },
|
||||
"cafeteria": { "user_language": "自助餐厅", "type": "noun", "pronunciation": "/ˌkæfəˈtɪriə/" },
|
||||
"mathematics": { "user_language": "数学", "type": "noun", "pronunciation": "/ˌmæθəˈmætɪks/" },
|
||||
"sun": { "user_language": "太阳", "type": "noun", "pronunciation": "/sʌn/" },
|
||||
"birds": { "user_language": "鸟", "type": "noun", "pronunciation": "/bɜːrdz/" },
|
||||
"shining": { "user_language": "照耀", "type": "verb-ing", "pronunciation": "/ˈʃaɪnɪŋ/" },
|
||||
"beautiful": { "user_language": "美丽的", "type": "adjective", "pronunciation": "/ˈbjuːtəfəl/" },
|
||||
"happy": { "user_language": "快乐的", "type": "adjective", "pronunciation": "/ˈhæpi/" },
|
||||
"violin": { "user_language": "小提琴", "type": "noun", "pronunciation": "/ˌvaɪəˈlɪn/" },
|
||||
"clarinet": { "user_language": "单簧管", "type": "noun", "pronunciation": "/ˌklærəˈnet/" },
|
||||
"trumpet": { "user_language": "小号", "type": "noun", "pronunciation": "/ˈtrʌmpɪt/" },
|
||||
"soccer": { "user_language": "足球", "type": "noun", "pronunciation": "/ˈsɑːkər/" },
|
||||
"tennis": { "user_language": "网球", "type": "noun", "pronunciation": "/ˈtenɪs/" },
|
||||
"basketball": { "user_language": "篮球", "type": "noun", "pronunciation": "/ˈbæskɪtbɔːl/" },
|
||||
"chess": { "user_language": "国际象棋", "type": "noun", "pronunciation": "/tʃes/" },
|
||||
"checkers": { "user_language": "跳棋", "type": "noun", "pronunciation": "/ˈtʃekərz/" },
|
||||
"nickname": { "user_language": "昵称", "type": "noun", "pronunciation": "/ˈnɪkneɪm/" },
|
||||
"title": { "user_language": "称呼", "type": "noun", "pronunciation": "/ˈtaɪtəl/" },
|
||||
"keypal": { "user_language": "网友", "type": "noun", "pronunciation": "/ˈkiːpæl/" },
|
||||
"computer": { "user_language": "电脑", "type": "noun", "pronunciation": "/kəmˈpjuːtər/" },
|
||||
"beach": { "user_language": "海滩", "type": "noun", "pronunciation": "/biːtʃ/" },
|
||||
"dog": { "user_language": "狗", "type": "noun", "pronunciation": "/dɔːɡ/" }
|
||||
},
|
||||
"phrases": {
|
||||
"What are you doing?": { "user_language": "你在做什么?", "context": "present-continuous-question", "pronunciation": "/wʌt ɑːr juː ˈduːɪŋ/" },
|
||||
"I'm reading": { "user_language": "我在读书", "context": "present-continuous-answer", "pronunciation": "/aɪm ˈriːdɪŋ/" },
|
||||
"We're cooking": { "user_language": "我们在做饭", "context": "present-continuous-answer", "pronunciation": "/wɪr ˈkʊkɪŋ/" },
|
||||
"They're studying English": { "user_language": "他们在学英语", "context": "present-continuous-answer", "pronunciation": "/ðeɪr ˈstʌdiɪŋ ˈɪŋɡlɪʃ/" },
|
||||
"What's Tom doing?": { "user_language": "汤姆在做什么?", "context": "present-continuous-question", "pronunciation": "/wʌts tɑːm ˈduːɪŋ/" },
|
||||
"He's eating": { "user_language": "他在吃东西", "context": "present-continuous-answer", "pronunciation": "/hiːz ˈiːtɪŋ/" },
|
||||
"She's watching TV": { "user_language": "她在看电视", "context": "present-continuous-answer", "pronunciation": "/ʃiːz ˈwɑːtʃɪŋ ˌtiːˈviː/" },
|
||||
"It's sleeping": { "user_language": "它在睡觉", "context": "present-continuous-answer", "pronunciation": "/ɪts ˈsliːpɪŋ/" },
|
||||
"Where's Walter?": { "user_language": "沃尔特在哪里?", "context": "location-question", "pronunciation": "/werz ˈwɔːltər/" },
|
||||
"He's in the kitchen": { "user_language": "他在厨房", "context": "location-answer", "pronunciation": "/hiːz ɪn ðə ˈkɪtʃɪn/" },
|
||||
"What's he doing?": { "user_language": "他在做什么?", "context": "activity-question", "pronunciation": "/wʌts hiː ˈduːɪŋ/" },
|
||||
"He's eating breakfast": { "user_language": "他在吃早餐", "context": "activity-answer", "pronunciation": "/hiːz ˈiːtɪŋ ˈbrekfəst/" },
|
||||
"The sun is shining": { "user_language": "阳光灿烂", "context": "description", "pronunciation": "/ðə sʌn ɪz ˈʃaɪnɪŋ/" },
|
||||
"The birds are singing": { "user_language": "鸟儿在歌唱", "context": "description", "pronunciation": "/ðə bɜːrdz ɑːr ˈsɪŋɪŋ/" },
|
||||
"It's a beautiful day": { "user_language": "今天天气真好", "context": "expression", "pronunciation": "/ɪts ə ˈbjuːtəfəl deɪ/" },
|
||||
"In the kitchen?": { "user_language": "在厨房?", "context": "checking-understanding", "pronunciation": "/ɪn ðə ˈkɪtʃɪn/" },
|
||||
"Right now": { "user_language": "现在,此刻", "context": "time-expression", "pronunciation": "/raɪt naʊ/" }
|
||||
},
|
||||
"dialogs": {
|
||||
"what_doing_basic": {
|
||||
"title": "What Are You Doing?",
|
||||
"participants": ["Person A", "Person B"],
|
||||
"lines": [
|
||||
{ "speaker": "Person A", "text": "What are you doing?", "user_language": "你在做什么?" },
|
||||
{ "speaker": "Person B", "text": "I'm reading.", "user_language": "我在读书。" },
|
||||
{ "speaker": "Person A", "text": "What are you doing?", "user_language": "你们在做什么?" },
|
||||
{ "speaker": "Person B", "text": "We're cooking.", "user_language": "我们在做饭。" },
|
||||
{ "speaker": "Person A", "text": "What are Mary and Fred doing?", "user_language": "玛丽和弗雷德在做什么?" },
|
||||
{ "speaker": "Person B", "text": "They're studying English.", "user_language": "他们在学英语。" }
|
||||
]
|
||||
},
|
||||
"what_doing_third_person": {
|
||||
"title": "What's He/She Doing?",
|
||||
"participants": ["Person A", "Person B"],
|
||||
"lines": [
|
||||
{ "speaker": "Person A", "text": "What's Tom doing?", "user_language": "汤姆在做什么?" },
|
||||
{ "speaker": "Person B", "text": "He's eating.", "user_language": "他在吃东西。" },
|
||||
{ "speaker": "Person A", "text": "What's Martha doing?", "user_language": "玛莎在做什么?" },
|
||||
{ "speaker": "Person B", "text": "She's watching TV.", "user_language": "她在看电视。" },
|
||||
{ "speaker": "Person A", "text": "What's your dog doing?", "user_language": "你的狗在做什么?" },
|
||||
{ "speaker": "Person B", "text": "It's sleeping.", "user_language": "它在睡觉。" }
|
||||
]
|
||||
},
|
||||
"where_and_what": {
|
||||
"title": "Where & What",
|
||||
"participants": ["Person A", "Person B"],
|
||||
"lines": [
|
||||
{ "speaker": "Person A", "text": "Where's Walter?", "user_language": "沃尔特在哪里?" },
|
||||
{ "speaker": "Person B", "text": "He's in the kitchen.", "user_language": "他在厨房。" },
|
||||
{ "speaker": "Person A", "text": "What's he doing?", "user_language": "他在做什么?" },
|
||||
{ "speaker": "Person B", "text": "He's eating breakfast.", "user_language": "他在吃早餐。" }
|
||||
]
|
||||
},
|
||||
"checking_understanding": {
|
||||
"title": "Checking Understanding",
|
||||
"participants": ["Person A", "Person B"],
|
||||
"lines": [
|
||||
{ "speaker": "Person A", "text": "Where's Walter?", "user_language": "沃尔特在哪里?" },
|
||||
{ "speaker": "Person B", "text": "He's in the kitchen.", "user_language": "他在厨房。" },
|
||||
{ "speaker": "Person A", "text": "In the kitchen?", "user_language": "在厨房?" },
|
||||
{ "speaker": "Person B", "text": "Yes.", "user_language": "是的。" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"texts": [
|
||||
{
|
||||
"title": "In the Park",
|
||||
"original_language": "The Jones family is in the park today. The sun is shining, and the birds are singing. It's a beautiful day! Mr. Jones is reading the newspaper. Mrs. Jones is listening to the radio. Sally and Patty Jones are studying. And Tommy Jones is playing the guitar. The Jones family is very happy today. It's a beautiful day, and they're in the park.",
|
||||
"user_language": "琼斯一家今天在公园里。阳光明媚,鸟儿在歌唱。多么美好的一天!琼斯先生在读报纸。琼斯太太在听收音机。莎莉和帕蒂·琼斯在学习。汤米·琼斯在弹吉他。琼斯一家今天非常快乐。天气真好,他们在公园里。"
|
||||
},
|
||||
{
|
||||
"title": "At Home in the Yard",
|
||||
"original_language": "The Chen family is at home in the yard today. The sun is shining, and the birds are singing. It's a beautiful day! Mr. Chen is planting flowers. Mrs. Chen is drinking lemonade and reading a book. Emily and Jason Chen are playing with the dog. And Jennifer Chen is sleeping. The Chen family is very happy today. It's a beautiful day, and they're at home in the yard.",
|
||||
"user_language": "陈家人今天在家里的院子里。阳光明媚,鸟儿在歌唱。多么美好的一天!陈先生在种花。陈太太在喝柠檬水和读书。艾米丽和杰森·陈在和狗玩。詹妮弗·陈在睡觉。陈家人今天非常快乐。天气真好,他们在家里的院子里。"
|
||||
}
|
||||
],
|
||||
"grammar": {
|
||||
"present-continuous": {
|
||||
"title": "Present Continuous Tense (现在进行时)",
|
||||
"explanation": "Use present continuous to describe actions happening right now. Form: am/is/are + verb-ing",
|
||||
"examples": [
|
||||
{
|
||||
"english": "I am eating / I'm eating",
|
||||
"translation": "我正在吃",
|
||||
"explanation": "Use 'am' with 'I' + verb-ing form"
|
||||
},
|
||||
{
|
||||
"english": "He is sleeping / He's sleeping",
|
||||
"translation": "他正在睡觉",
|
||||
"explanation": "Use 'is' with he/she/it + verb-ing form"
|
||||
},
|
||||
{
|
||||
"english": "We are cooking / We're cooking",
|
||||
"translation": "我们正在做饭",
|
||||
"explanation": "Use 'are' with we/you/they + verb-ing form"
|
||||
},
|
||||
{
|
||||
"english": "What are you doing?",
|
||||
"translation": "你在做什么?",
|
||||
"explanation": "Question form: What + am/is/are + subject + doing?"
|
||||
}
|
||||
]
|
||||
},
|
||||
"verb-ing-formation": {
|
||||
"title": "Forming -ing Verbs",
|
||||
"explanation": "To make the -ing form, add -ing to the base verb. Some spelling rules apply.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "read → reading",
|
||||
"translation": "读 → 正在读",
|
||||
"explanation": "Simply add -ing to most verbs"
|
||||
},
|
||||
{
|
||||
"english": "eat → eating, cook → cooking",
|
||||
"translation": "吃 → 正在吃,做饭 → 正在做饭",
|
||||
"explanation": "For regular verbs, just add -ing"
|
||||
},
|
||||
{
|
||||
"english": "study → studying, play → playing",
|
||||
"translation": "学习 → 正在学习,玩 → 正在玩",
|
||||
"explanation": "Keep the 'y' and add -ing"
|
||||
}
|
||||
]
|
||||
},
|
||||
"questions-present-continuous": {
|
||||
"title": "Present Continuous Questions",
|
||||
"explanation": "To ask questions, put am/is/are before the subject, followed by verb-ing",
|
||||
"examples": [
|
||||
{
|
||||
"english": "What are you doing?",
|
||||
"translation": "你在做什么?",
|
||||
"explanation": "Pattern: What + are + you + doing?"
|
||||
},
|
||||
{
|
||||
"english": "What is Tom doing? / What's Tom doing?",
|
||||
"translation": "汤姆在做什么?",
|
||||
"explanation": "Pattern: What + is + name + doing?"
|
||||
},
|
||||
{
|
||||
"english": "Where are they playing?",
|
||||
"translation": "他们在哪里玩?",
|
||||
"explanation": "Can combine Where/What with present continuous"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"fillInBlanks": [
|
||||
{
|
||||
"sentence": "What ___ you doing?",
|
||||
"options": ["are", "is", "am", "be"],
|
||||
"correctAnswer": "are",
|
||||
"explanation": "Use 'are' with 'you' in present continuous questions",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"sentence": "I ___ reading the newspaper",
|
||||
"options": ["'m", "is", "are", "be"],
|
||||
"correctAnswer": "'m",
|
||||
"explanation": "Use 'I'm' (I am) in present continuous",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"sentence": "He's ___ breakfast",
|
||||
"options": ["eating", "eat", "eats", "to eat"],
|
||||
"correctAnswer": "eating",
|
||||
"explanation": "Use verb-ing form after am/is/are",
|
||||
"grammarFocus": "verb-ing-formation"
|
||||
},
|
||||
{
|
||||
"sentence": "They're ___ English",
|
||||
"options": ["studying", "study", "studies", "to study"],
|
||||
"correctAnswer": "studying",
|
||||
"explanation": "Use verb-ing form with 'are'",
|
||||
"grammarFocus": "verb-ing-formation"
|
||||
},
|
||||
{
|
||||
"sentence": "What's Tom ___?",
|
||||
"options": ["doing", "do", "does", "to do"],
|
||||
"correctAnswer": "doing",
|
||||
"explanation": "Use 'doing' in What questions with present continuous",
|
||||
"grammarFocus": "questions-present-continuous"
|
||||
},
|
||||
{
|
||||
"sentence": "She ___ watching TV",
|
||||
"options": ["'s", "'re", "'m", "be"],
|
||||
"correctAnswer": "'s",
|
||||
"explanation": "Use 'is' (she's) with third person singular",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"sentence": "We're ___ dinner",
|
||||
"options": ["cooking", "cook", "cooks", "to cook"],
|
||||
"correctAnswer": "cooking",
|
||||
"explanation": "Use verb-ing form in present continuous",
|
||||
"grammarFocus": "verb-ing-formation"
|
||||
},
|
||||
{
|
||||
"sentence": "The sun ___ shining",
|
||||
"options": ["is", "are", "am", "be"],
|
||||
"correctAnswer": "is",
|
||||
"explanation": "Use 'is' with singular subjects like 'sun'",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"sentence": "The birds are ___",
|
||||
"options": ["singing", "sing", "sings", "to sing"],
|
||||
"correctAnswer": "singing",
|
||||
"explanation": "Use verb-ing after 'are'",
|
||||
"grammarFocus": "verb-ing-formation"
|
||||
},
|
||||
{
|
||||
"sentence": "Mr. Jones is ___ the newspaper",
|
||||
"options": ["reading", "read", "reads", "to read"],
|
||||
"correctAnswer": "reading",
|
||||
"explanation": "Use verb-ing form with 'is'",
|
||||
"grammarFocus": "verb-ing-formation"
|
||||
},
|
||||
{
|
||||
"sentence": "What are Mary and Fred ___?",
|
||||
"options": ["doing", "do", "does", "to do"],
|
||||
"correctAnswer": "doing",
|
||||
"explanation": "Use 'doing' in What questions",
|
||||
"grammarFocus": "questions-present-continuous"
|
||||
},
|
||||
{
|
||||
"sentence": "Tommy is playing ___ guitar",
|
||||
"options": ["the", "a", "an", "—"],
|
||||
"correctAnswer": "the",
|
||||
"explanation": "Always use 'the' before musical instruments",
|
||||
"grammarFocus": "articles"
|
||||
},
|
||||
{
|
||||
"sentence": "They're playing ___",
|
||||
"options": ["baseball", "the baseball", "a baseball", "an baseball"],
|
||||
"correctAnswer": "baseball",
|
||||
"explanation": "Don't use 'the' with sports names",
|
||||
"grammarFocus": "articles"
|
||||
},
|
||||
{
|
||||
"sentence": "Jennifer ___ sleeping",
|
||||
"options": ["is", "are", "am", "be"],
|
||||
"correctAnswer": "is",
|
||||
"explanation": "Use 'is' with singular third person (Jennifer)",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"sentence": "Mrs. Chen is ___ to music",
|
||||
"options": ["listening", "listen", "listens", "to listen"],
|
||||
"correctAnswer": "listening",
|
||||
"explanation": "Use verb-ing form for present continuous",
|
||||
"grammarFocus": "verb-ing-formation"
|
||||
}
|
||||
],
|
||||
"corrections": [
|
||||
{
|
||||
"correct": "What are you doing?",
|
||||
"incorrect": "What you doing?",
|
||||
"explanation": "Always include am/is/are in present continuous questions",
|
||||
"grammarFocus": "questions-present-continuous"
|
||||
},
|
||||
{
|
||||
"correct": "I'm reading",
|
||||
"incorrect": "I reading",
|
||||
"explanation": "Must include 'am' (I'm) before the -ing verb",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"correct": "He's eating breakfast",
|
||||
"incorrect": "He eating breakfast",
|
||||
"explanation": "Include 'is' (He's) in present continuous",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"correct": "They're studying English",
|
||||
"incorrect": "They studying English",
|
||||
"explanation": "Include 'are' (They're) before -ing verb",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"correct": "She's watching TV",
|
||||
"incorrect": "She's watch TV",
|
||||
"explanation": "Use -ing form (watching), not base form (watch)",
|
||||
"grammarFocus": "verb-ing-formation"
|
||||
},
|
||||
{
|
||||
"correct": "Tommy is playing the guitar",
|
||||
"incorrect": "Tommy is playing guitar",
|
||||
"explanation": "Always use 'the' before musical instruments",
|
||||
"grammarFocus": "articles"
|
||||
},
|
||||
{
|
||||
"correct": "They're playing baseball",
|
||||
"incorrect": "They're playing the baseball",
|
||||
"explanation": "Don't use 'the' with sports names",
|
||||
"grammarFocus": "articles"
|
||||
},
|
||||
{
|
||||
"correct": "What's Tom doing?",
|
||||
"incorrect": "What Tom doing?",
|
||||
"explanation": "Include 'is' (What's = What is) in questions",
|
||||
"grammarFocus": "questions-present-continuous"
|
||||
},
|
||||
{
|
||||
"correct": "The sun is shining",
|
||||
"incorrect": "The sun shining",
|
||||
"explanation": "Include 'is' before -ing verb",
|
||||
"grammarFocus": "present-continuous"
|
||||
},
|
||||
{
|
||||
"correct": "I'm listening to music",
|
||||
"incorrect": "I'm listening music",
|
||||
"explanation": "Use 'listen to' (not just 'listen') when there's an object",
|
||||
"grammarFocus": "verb-preposition"
|
||||
}
|
||||
],
|
||||
"exercises": {
|
||||
"complete_dialogues": {
|
||||
"type": "fill_in_conversation",
|
||||
"instructions": "Complete the dialogues with the correct words",
|
||||
"items": [
|
||||
{
|
||||
"question": "A: What are you doing?\nB: __________ reading the newspaper.",
|
||||
"answer": "I'm",
|
||||
"user_language": "A: 你在做什么?\nB: __________ 在读报纸。"
|
||||
},
|
||||
{
|
||||
"question": "A: __________ Mr. and Mrs. Lane doing?\nB: __________ cooking dinner.",
|
||||
"answer": "What are / They're",
|
||||
"user_language": "A: 莱恩先生和太太在做什么?\nB: 他们在做晚饭。"
|
||||
},
|
||||
{
|
||||
"question": "A: __________ Rita doing?\nB: __________ studying English.",
|
||||
"answer": "What's / She's",
|
||||
"user_language": "A: 丽塔在做什么?\nB: 她在学英语。"
|
||||
},
|
||||
{
|
||||
"question": "A: __________ Henry doing?\nB: __________ sleeping.",
|
||||
"answer": "What's / He's",
|
||||
"user_language": "A: 亨利在做什么?\nB: 他在睡觉。"
|
||||
}
|
||||
]
|
||||
},
|
||||
"reading_check": {
|
||||
"type": "true_false",
|
||||
"instructions": "In the Park & At Home in the Yard - True or False?",
|
||||
"items": [
|
||||
{ "statement": "The Jones family is at home in the yard today", "answer": false, "user_language": "琼斯一家今天在家里的院子里" },
|
||||
{ "statement": "Mr. Chen is planting flowers", "answer": true, "user_language": "陈先生在种花" },
|
||||
{ "statement": "Patty Jones is studying", "answer": true, "user_language": "帕蒂·琼斯在学习" },
|
||||
{ "statement": "Jason Chen is reading a book", "answer": false, "user_language": "杰森·陈在读书" },
|
||||
{ "statement": "The Chen family is singing", "answer": false, "user_language": "陈家人在唱歌" },
|
||||
{ "statement": "The Jones family and the Chen family are very happy today", "answer": true, "user_language": "琼斯一家和陈家人今天都很快乐" }
|
||||
]
|
||||
},
|
||||
"location_and_activity": {
|
||||
"type": "conversation_practice",
|
||||
"instructions": "Ask and answer: Where is [person]? What's he/she doing?",
|
||||
"items": [
|
||||
{
|
||||
"person": "Karen",
|
||||
"location": "park",
|
||||
"activity": "eating lunch",
|
||||
"user_language_person": "凯伦",
|
||||
"user_language_location": "公园",
|
||||
"user_language_activity": "吃午餐"
|
||||
},
|
||||
{
|
||||
"person": "Mr. and Mrs. Clark",
|
||||
"location": "dining room",
|
||||
"activity": "eating dinner",
|
||||
"user_language_person": "克拉克先生和太太",
|
||||
"user_language_location": "餐厅",
|
||||
"user_language_activity": "吃晚餐"
|
||||
},
|
||||
{
|
||||
"person": "Miss Baker",
|
||||
"location": "cafeteria",
|
||||
"activity": "drinking milk",
|
||||
"user_language_person": "贝克小姐",
|
||||
"user_language_location": "自助餐厅",
|
||||
"user_language_activity": "喝牛奶"
|
||||
},
|
||||
{
|
||||
"person": "Ms. Johnson",
|
||||
"location": "classroom",
|
||||
"activity": "teaching mathematics",
|
||||
"user_language_person": "约翰逊女士",
|
||||
"user_language_location": "教室",
|
||||
"user_language_activity": "教数学"
|
||||
},
|
||||
{
|
||||
"person": "Martin",
|
||||
"location": "bathroom",
|
||||
"activity": "singing",
|
||||
"user_language_person": "马丁",
|
||||
"user_language_location": "浴室",
|
||||
"user_language_activity": "唱歌"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"cultural_notes": {
|
||||
"titles": {
|
||||
"title": "Titles in English",
|
||||
"explanation": "English uses titles before names to show respect and marital status",
|
||||
"examples": [
|
||||
{
|
||||
"term": "Mr.",
|
||||
"usage": "Title for a man",
|
||||
"chinese": "先生"
|
||||
},
|
||||
{
|
||||
"term": "Mrs.",
|
||||
"usage": "Title for a married woman",
|
||||
"chinese": "太太(已婚)"
|
||||
},
|
||||
{
|
||||
"term": "Ms.",
|
||||
"usage": "Title for a woman (married or unmarried)",
|
||||
"chinese": "女士"
|
||||
},
|
||||
{
|
||||
"term": "Miss",
|
||||
"usage": "Title for an unmarried woman",
|
||||
"chinese": "小姐(未婚)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"nicknames": {
|
||||
"title": "Common English Nicknames",
|
||||
"explanation": "Many English names have short, informal versions called nicknames",
|
||||
"examples": [
|
||||
{ "full": "James", "nickname": "Jim", "chinese": "詹姆斯 → 吉姆" },
|
||||
{ "full": "Robert", "nickname": "Bob", "chinese": "罗伯特 → 鲍勃" },
|
||||
{ "full": "William", "nickname": "Bill", "chinese": "威廉 → 比尔" },
|
||||
{ "full": "Elizabeth", "nickname": "Liz, Betty", "chinese": "伊丽莎白 → 莉兹、贝蒂" },
|
||||
{ "full": "Jennifer", "nickname": "Jenny", "chinese": "珍妮弗 → 珍妮" },
|
||||
{ "full": "Patricia", "nickname": "Patty", "chinese": "帕特丽夏 → 帕蒂" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"thematic_questions": {
|
||||
"present_continuous_you": [
|
||||
{
|
||||
"id": "q1",
|
||||
"question": "What are you doing?",
|
||||
"question_user_language": "你在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"I'm reading",
|
||||
"I'm studying English",
|
||||
"I'm cooking dinner"
|
||||
],
|
||||
"theme": "present_continuous_you"
|
||||
},
|
||||
{
|
||||
"id": "q2",
|
||||
"question": "What are you doing right now?",
|
||||
"question_user_language": "你现在在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"I'm watching TV",
|
||||
"I'm eating lunch",
|
||||
"I'm listening to music"
|
||||
],
|
||||
"theme": "present_continuous_you"
|
||||
},
|
||||
{
|
||||
"id": "q3",
|
||||
"question": "What are you and your friend doing?",
|
||||
"question_user_language": "你和你的朋友在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"We're playing cards",
|
||||
"We're studying",
|
||||
"We're cooking dinner"
|
||||
],
|
||||
"theme": "present_continuous_you"
|
||||
},
|
||||
{
|
||||
"id": "q4",
|
||||
"question": "What are Mary and Fred doing?",
|
||||
"question_user_language": "玛丽和弗雷德在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"They're studying English",
|
||||
"They're playing baseball",
|
||||
"They're watching TV"
|
||||
],
|
||||
"theme": "present_continuous_you"
|
||||
},
|
||||
{
|
||||
"id": "q5",
|
||||
"question": "What are the students doing?",
|
||||
"question_user_language": "学生们在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"They're studying",
|
||||
"They're reading",
|
||||
"They're listening to the teacher"
|
||||
],
|
||||
"theme": "present_continuous_you"
|
||||
}
|
||||
],
|
||||
"present_continuous_third_person": [
|
||||
{
|
||||
"id": "q6",
|
||||
"question": "What's Tom doing?",
|
||||
"question_user_language": "汤姆在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's eating",
|
||||
"He's reading the newspaper",
|
||||
"He's sleeping"
|
||||
],
|
||||
"theme": "present_continuous_third_person"
|
||||
},
|
||||
{
|
||||
"id": "q7",
|
||||
"question": "What's Martha doing?",
|
||||
"question_user_language": "玛莎在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"She's watching TV",
|
||||
"She's cooking",
|
||||
"She's studying"
|
||||
],
|
||||
"theme": "present_continuous_third_person"
|
||||
},
|
||||
{
|
||||
"id": "q8",
|
||||
"question": "What's your dog doing?",
|
||||
"question_user_language": "你的狗在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It's sleeping",
|
||||
"It's playing",
|
||||
"It's eating"
|
||||
],
|
||||
"theme": "present_continuous_third_person"
|
||||
},
|
||||
{
|
||||
"id": "q9",
|
||||
"question": "What's Tommy doing?",
|
||||
"question_user_language": "汤米在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's playing the guitar",
|
||||
"He's playing baseball",
|
||||
"He's singing"
|
||||
],
|
||||
"theme": "present_continuous_third_person"
|
||||
},
|
||||
{
|
||||
"id": "q10",
|
||||
"question": "What's Mrs. Jones doing?",
|
||||
"question_user_language": "琼斯太太在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"She's listening to the radio",
|
||||
"She's reading a book",
|
||||
"She's cooking"
|
||||
],
|
||||
"theme": "present_continuous_third_person"
|
||||
}
|
||||
],
|
||||
"reading_comprehension": [
|
||||
{
|
||||
"id": "q11",
|
||||
"question": "What's Mr. Jones doing in the park?",
|
||||
"question_user_language": "琼斯先生在公园里做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's reading the newspaper",
|
||||
"Reading the newspaper",
|
||||
"He's reading"
|
||||
],
|
||||
"theme": "reading_comprehension"
|
||||
},
|
||||
{
|
||||
"id": "q12",
|
||||
"question": "What's Mr. Chen doing in the yard?",
|
||||
"question_user_language": "陈先生在院子里做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's planting flowers",
|
||||
"Planting flowers",
|
||||
"He's gardening"
|
||||
],
|
||||
"theme": "reading_comprehension"
|
||||
},
|
||||
{
|
||||
"id": "q13",
|
||||
"question": "What are Emily and Jason Chen doing?",
|
||||
"question_user_language": "艾米丽和杰森·陈在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"They're playing with the dog",
|
||||
"Playing with the dog",
|
||||
"They're playing"
|
||||
],
|
||||
"theme": "reading_comprehension"
|
||||
},
|
||||
{
|
||||
"id": "q14",
|
||||
"question": "What's Jennifer Chen doing?",
|
||||
"question_user_language": "詹妮弗·陈在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"She's sleeping",
|
||||
"Sleeping",
|
||||
"She's taking a nap"
|
||||
],
|
||||
"theme": "reading_comprehension"
|
||||
}
|
||||
],
|
||||
"location_and_activity": [
|
||||
{
|
||||
"id": "q15",
|
||||
"question": "Where's Walter and what's he doing?",
|
||||
"question_user_language": "沃尔特在哪里,他在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"He's in the kitchen. He's eating breakfast",
|
||||
"In the kitchen, eating breakfast",
|
||||
"He's eating breakfast in the kitchen"
|
||||
],
|
||||
"theme": "location_and_activity"
|
||||
},
|
||||
{
|
||||
"id": "q16",
|
||||
"question": "Where's Karen and what's she doing?",
|
||||
"question_user_language": "凯伦在哪里,她在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"She's in the park. She's eating lunch",
|
||||
"In the park, eating lunch",
|
||||
"She's eating lunch in the park"
|
||||
],
|
||||
"theme": "location_and_activity"
|
||||
},
|
||||
{
|
||||
"id": "q17",
|
||||
"question": "Where's Ms. Johnson and what's she doing?",
|
||||
"question_user_language": "约翰逊女士在哪里,她在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"She's in the classroom. She's teaching mathematics",
|
||||
"In the classroom, teaching mathematics",
|
||||
"She's teaching in the classroom"
|
||||
],
|
||||
"theme": "location_and_activity"
|
||||
},
|
||||
{
|
||||
"id": "q18",
|
||||
"question": "Where are you and what are you doing?",
|
||||
"question_user_language": "你在哪里,你在做什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"I'm at home. I'm studying",
|
||||
"At home, studying",
|
||||
"I'm studying at home"
|
||||
],
|
||||
"theme": "location_and_activity"
|
||||
}
|
||||
]
|
||||
},
|
||||
"statistics": {
|
||||
"vocabulary_count": 45,
|
||||
"phrases_count": 17,
|
||||
"dialogs_count": 4,
|
||||
"texts_count": 2,
|
||||
"exercises_count": 3,
|
||||
"fillInBlanks_count": 15,
|
||||
"corrections_count": 10,
|
||||
"thematic_questions_count": 18,
|
||||
"estimated_completion_time": 18
|
||||
}
|
||||
}
|
||||
@ -139,6 +139,33 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"texts": [
|
||||
{
|
||||
"title": "My New Apartment",
|
||||
"original_language": "I live in a two-bedroom apartment on Central Avenue. It's in the center of town, so it's very convenient. There's a bus stop right outside the building. My apartment has a nice refrigerator, a big closet, and an air conditioner. The building has an elevator and a jacuzzi. The superintendent is very helpful. There's a lot of noise on the sidewalks all day and all night, but I like living here because everything is convenient.",
|
||||
"user_language": "我住在中央大道的一间两居室公寓。它在市中心,所以非常便利。大楼外面就有一个公交车站。我的公寓有一个漂亮的冰箱、一个大衣柜和一台空调。大楼有电梯和按摩浴缸。物业主管非常乐于助人。人行道上整日整夜都有很多噪音,但我喜欢住在这里,因为一切都很方便。"
|
||||
},
|
||||
{
|
||||
"title": "Getting Dressed for Work",
|
||||
"original_language": "Every morning, I get dressed for work. Today I'm wearing a blue shirt, black pants, and brown shoes. I also have a jacket because it's cold outside. I need to wear a suit for my job interview tomorrow, so I'm wearing a nice tie too. My shoes are very comfortable. I always wear socks and a belt. In winter, I wear gloves and a scarf. In summer, I wear shorts and sneakers on the weekend.",
|
||||
"user_language": "每天早上,我都要穿好衣服去上班。今天我穿着一件蓝色衬衫、黑色裤子和棕色鞋子。因为外面很冷,我还穿了一件夹克。明天我要参加工作面试,需要穿套装,所以我也戴了一条漂亮的领带。我的鞋子非常舒适。我总是穿袜子和系腰带。冬天,我戴手套和围巾。夏天,周末我穿短裤和运动鞋。"
|
||||
},
|
||||
{
|
||||
"title": "How I Feel Today",
|
||||
"original_language": "I feel happy today because it's Friday. Yesterday I felt tired because I worked all day and all night. Sometimes I feel worried about my job, but today I feel excited. My friend feels sad because she has a test tomorrow. Are you hungry? I'm very hungry because I haven't eaten all day. It's hot outside, so I feel thirsty. My feet hurt from walking, and my fingers hurt from typing on the computer.",
|
||||
"user_language": "我今天感到很快乐,因为今天是星期五。昨天我感到很累,因为我整日整夜都在工作。有时我会担心我的工作,但今天我感到很兴奋。我的朋友感到难过,因为她明天有考试。你饿吗?我非常饿,因为我一整天都没吃东西。外面很热,所以我感到口渴。我的脚因为走路而疼,我的手指因为在电脑上打字而疼。"
|
||||
},
|
||||
{
|
||||
"title": "My Daily Technology Use",
|
||||
"original_language": "I use my computer and laptop every day for work. I need to check my email in the morning. I have internet access at home and at the office. I use my phone and tablet to browse websites and use apps. I spend a lot of time on social media. I need a password for my email and all my apps. Do you have internet access? I need to check my email right now. Technology is very convenient, but sometimes my eyes hurt from looking at the computer screen all day.",
|
||||
"user_language": "我每天都使用电脑和笔记本电脑工作。早上我需要查看我的电子邮件。我在家里和办公室都有网络连接。我使用手机和平板电脑浏览网站和使用应用程序。我花很多时间在社交媒体上。我的电子邮件和所有应用程序都需要密码。你有网络连接吗?我现在需要查看我的电子邮件。科技非常方便,但有时我的眼睛因为整天看电脑屏幕而疼。"
|
||||
},
|
||||
{
|
||||
"title": "Describing People",
|
||||
"original_language": "My friend has long hair and beautiful eyes. She has a nice face and a friendly smile. She's tall with long arms and legs. My boss is wearing a suit today with a red tie. He has short hair and wears glasses. My sister is wearing a dress and boots. She has a scarf around her neck because it's cold. The superintendent of my building is wearing jeans and a sweater. He has strong shoulders and big hands.",
|
||||
"user_language": "我的朋友有长头发和美丽的眼睛。她有一张漂亮的脸和友好的笑容。她个子高,胳膊和腿都很长。我的老板今天穿着套装,打着红色领带。他有短发,戴着眼镜。我的妹妹穿着连衣裙和靴子。她脖子上围着围巾,因为天气很冷。我们楼的物业主管穿着牛仔裤和毛衣。他有强壮的肩膀和大手。"
|
||||
}
|
||||
],
|
||||
"exercises": {
|
||||
"vocabulary_matching": {
|
||||
"type": "matching",
|
||||
@ -398,6 +425,7 @@
|
||||
"vocabulary_count": 67,
|
||||
"phrases_count": 10,
|
||||
"dialogs_count": 2,
|
||||
"texts_count": 5,
|
||||
"exercises_count": 2,
|
||||
"fillInBlanks_count": 15,
|
||||
"corrections_count": 10,
|
||||
|
||||
646
content/chapters/wte2-2.json
Normal file
646
content/chapters/wte2-2.json
Normal file
@ -0,0 +1,646 @@
|
||||
{
|
||||
"id": "wte2-2",
|
||||
"book_id": "wte2",
|
||||
"name": "Our Pet Friends & Letters W-Z",
|
||||
"description": "Welcome to English 2 Unit 2 - Learn furniture, prepositions of place, where questions, and letters W-Z",
|
||||
"difficulty": "beginner",
|
||||
"language": "en-US",
|
||||
"chapter_number": "2",
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2025-10-18",
|
||||
"updated": "2025-10-18",
|
||||
"source": "Welcome to English 2 - Oxford University Press",
|
||||
"target_level": "beginner",
|
||||
"estimated_hours": 4,
|
||||
"prerequisites": ["wte2-1"],
|
||||
"learning_objectives": [
|
||||
"Use prepositions: in, on, under, near",
|
||||
"Ask and answer 'Where is/are...?' questions",
|
||||
"Identify furniture vocabulary",
|
||||
"Use contractions: isn't, aren't, let's",
|
||||
"Recognize and write letters W, X, Y, Z",
|
||||
"Read short stories about finding pets"
|
||||
],
|
||||
"content_tags": ["furniture", "pets", "prepositions", "location", "letters", "phonics", "where-questions"],
|
||||
"completion_criteria": {
|
||||
"vocabulary_mastery": 80,
|
||||
"quiz_score": 75,
|
||||
"games_completed": 3
|
||||
}
|
||||
},
|
||||
"letters": {
|
||||
"W": [
|
||||
{ "word": "wolf", "translation": "狼", "type": "noun", "pronunciation": "/wʊlf/" },
|
||||
{ "word": "web", "translation": "网;蜘蛛网", "type": "noun", "pronunciation": "/web/" },
|
||||
{ "word": "water", "translation": "水", "type": "noun", "pronunciation": "/ˈwɔːtər/" },
|
||||
{ "word": "watch", "translation": "手表;观看", "type": "noun/verb", "pronunciation": "/wɑːtʃ/" }
|
||||
],
|
||||
"X": [
|
||||
{ "word": "fox", "translation": "狐狸", "type": "noun", "pronunciation": "/fɑːks/" },
|
||||
{ "word": "box", "translation": "盒子;箱子", "type": "noun", "pronunciation": "/bɑːks/" },
|
||||
{ "word": "six", "translation": "六", "type": "number", "pronunciation": "/sɪks/" },
|
||||
{ "word": "wax", "translation": "蜡", "type": "noun", "pronunciation": "/wæks/" }
|
||||
],
|
||||
"Y": [
|
||||
{ "word": "yo-yo", "translation": "悠悠球", "type": "noun", "pronunciation": "/ˈjoʊjoʊ/" },
|
||||
{ "word": "yak", "translation": "牦牛", "type": "noun", "pronunciation": "/jæk/" },
|
||||
{ "word": "yogurt", "translation": "酸奶", "type": "noun", "pronunciation": "/ˈjoʊɡərt/" },
|
||||
{ "word": "yacht", "translation": "游艇", "type": "noun", "pronunciation": "/jɑːt/" }
|
||||
],
|
||||
"Z": [
|
||||
{ "word": "zipper", "translation": "拉链", "type": "noun", "pronunciation": "/ˈzɪpər/" },
|
||||
{ "word": "zero", "translation": "零", "type": "number", "pronunciation": "/ˈzɪroʊ/" },
|
||||
{ "word": "zoo", "translation": "动物园", "type": "noun", "pronunciation": "/zuː/" },
|
||||
{ "word": "zebra", "translation": "斑马", "type": "noun", "pronunciation": "/ˈziːbrə/" }
|
||||
]
|
||||
},
|
||||
"vocabulary": {
|
||||
"sofa": { "user_language": "沙发", "type": "noun", "pronunciation": "/ˈsoʊfə/" },
|
||||
"table": { "user_language": "桌子", "type": "noun", "pronunciation": "/ˈteɪbəl/" },
|
||||
"chair": { "user_language": "椅子", "type": "noun", "pronunciation": "/tʃer/" },
|
||||
"box": { "user_language": "盒子;箱子", "type": "noun", "pronunciation": "/bɑːks/" },
|
||||
"cupboard": { "user_language": "橱柜;碗柜", "type": "noun", "pronunciation": "/ˈkʌbərd/" },
|
||||
"shelf": { "user_language": "架子;搁板", "type": "noun", "pronunciation": "/ʃelf/" },
|
||||
"bag": { "user_language": "包;袋子", "type": "noun", "pronunciation": "/bæɡ/" },
|
||||
"bed": { "user_language": "床", "type": "noun", "pronunciation": "/bed/" },
|
||||
"desk": { "user_language": "书桌", "type": "noun", "pronunciation": "/desk/" },
|
||||
"drawer": { "user_language": "抽屉", "type": "noun", "pronunciation": "/drɔːr/" },
|
||||
"dog": { "user_language": "狗", "type": "noun", "pronunciation": "/dɔːɡ/" },
|
||||
"cat": { "user_language": "猫", "type": "noun", "pronunciation": "/kæt/" },
|
||||
"hamster": { "user_language": "仓鼠", "type": "noun", "pronunciation": "/ˈhæmstər/" },
|
||||
"rabbit": { "user_language": "兔子", "type": "noun", "pronunciation": "/ˈræbɪt/" },
|
||||
"turtle": { "user_language": "乌龟", "type": "noun", "pronunciation": "/ˈtɜːrtl/" },
|
||||
"bird": { "user_language": "鸟", "type": "noun", "pronunciation": "/bɜːrd/" },
|
||||
"on": { "user_language": "在……上面", "type": "preposition", "pronunciation": "/ɑːn/" },
|
||||
"in": { "user_language": "在……里面", "type": "preposition", "pronunciation": "/ɪn/" },
|
||||
"under": { "user_language": "在……下面", "type": "preposition", "pronunciation": "/ˈʌndər/" },
|
||||
"near": { "user_language": "在……附近", "type": "preposition", "pronunciation": "/nɪr/" },
|
||||
"sad": { "user_language": "伤心的;难过的", "type": "adjective", "pronunciation": "/sæd/" },
|
||||
"find": { "user_language": "找到;发现", "type": "verb", "pronunciation": "/faɪnd/" },
|
||||
"eyes": { "user_language": "眼睛", "type": "noun", "pronunciation": "/aɪz/" },
|
||||
"wolf": { "user_language": "狼", "type": "noun", "pronunciation": "/wʊlf/" },
|
||||
"web": { "user_language": "网;蜘蛛网", "type": "noun", "pronunciation": "/web/" },
|
||||
"water": { "user_language": "水", "type": "noun", "pronunciation": "/ˈwɔːtər/" },
|
||||
"watch": { "user_language": "手表;观看", "type": "noun/verb", "pronunciation": "/wɑːtʃ/" },
|
||||
"fox": { "user_language": "狐狸", "type": "noun", "pronunciation": "/fɑːks/" },
|
||||
"six": { "user_language": "六", "type": "number", "pronunciation": "/sɪks/" },
|
||||
"wax": { "user_language": "蜡", "type": "noun", "pronunciation": "/wæks/" },
|
||||
"yo-yo": { "user_language": "悠悠球", "type": "noun", "pronunciation": "/ˈjoʊjoʊ/" },
|
||||
"yak": { "user_language": "牦牛", "type": "noun", "pronunciation": "/jæk/" },
|
||||
"yogurt": { "user_language": "酸奶", "type": "noun", "pronunciation": "/ˈjoʊɡərt/" },
|
||||
"yacht": { "user_language": "游艇", "type": "noun", "pronunciation": "/jɑːt/" },
|
||||
"zipper": { "user_language": "拉链", "type": "noun", "pronunciation": "/ˈzɪpər/" },
|
||||
"zero": { "user_language": "零", "type": "number", "pronunciation": "/ˈzɪroʊ/" },
|
||||
"zoo": { "user_language": "动物园", "type": "noun", "pronunciation": "/zuː/" },
|
||||
"zebra": { "user_language": "斑马", "type": "noun", "pronunciation": "/ˈziːbrə/" },
|
||||
"fat": { "user_language": "胖的", "type": "adjective", "pronunciation": "/fæt/" },
|
||||
"hat": { "user_language": "帽子", "type": "noun", "pronunciation": "/hæt/" },
|
||||
"bad": { "user_language": "坏的", "type": "adjective", "pronunciation": "/bæd/" }
|
||||
},
|
||||
"phrases": {
|
||||
"Where is the cat?": { "user_language": "猫在哪里?", "context": "location-question", "pronunciation": "/wer ɪz ðə kæt/" },
|
||||
"It is on the chair": { "user_language": "它在椅子上。", "context": "location-answer", "pronunciation": "/ɪt ɪz ɑːn ðə tʃer/" },
|
||||
"Where are the turtles?": { "user_language": "乌龟在哪里?", "context": "location-question", "pronunciation": "/wer ɑːr ðə ˈtɜːrtlz/" },
|
||||
"They are under the sofa": { "user_language": "它们在沙发下面。", "context": "location-answer", "pronunciation": "/ðeɪ ɑːr ˈʌndər ðə ˈsoʊfə/" },
|
||||
"One is in the cupboard": { "user_language": "一只在橱柜里。", "context": "location-answer", "pronunciation": "/wʌn ɪz ɪn ðə ˈkʌbərd/" },
|
||||
"One is near the sofa": { "user_language": "一只在沙发附近。", "context": "location-answer", "pronunciation": "/wʌn ɪz nɪr ðə ˈsoʊfə/" },
|
||||
"Is it in the box?": { "user_language": "它在盒子里吗?", "context": "yes-no-question", "pronunciation": "/ɪz ɪt ɪn ðə bɑːks/" },
|
||||
"Yes, it is": { "user_language": "是的,它在。", "context": "affirmative", "pronunciation": "/jes ɪt ɪz/" },
|
||||
"No, it isn't": { "user_language": "不,它不在。", "context": "negative", "pronunciation": "/noʊ ɪt ˈɪzənt/" },
|
||||
"Are they under the bed?": { "user_language": "它们在床下面吗?", "context": "yes-no-question", "pronunciation": "/ɑːr ðeɪ ˈʌndər ðə bed/" },
|
||||
"Yes, they are": { "user_language": "是的,它们在。", "context": "affirmative", "pronunciation": "/jes ðeɪ ɑːr/" },
|
||||
"No, they aren't": { "user_language": "不,它们不在。", "context": "negative", "pronunciation": "/noʊ ðeɪ ˈɑːrənt/" },
|
||||
"He cannot find Bob": { "user_language": "他找不到鲍勃。", "context": "statement", "pronunciation": "/hi ˈkænɑːt faɪnd bɑːb/" },
|
||||
"Let's find Bob": { "user_language": "我们一起找鲍勃吧。", "context": "suggestion", "pronunciation": "/lets faɪnd bɑːb/" },
|
||||
"Come on, Ricky": { "user_language": "来吧,瑞奇。", "context": "imperative", "pronunciation": "/kʌm ɑːn ˈrɪki/" },
|
||||
"Well done!": { "user_language": "做得好!", "context": "praise", "pronunciation": "/wel dʌn/" },
|
||||
"Close your eyes": { "user_language": "闭上你的眼睛。", "context": "imperative", "pronunciation": "/kloʊz jʊr aɪz/" }
|
||||
},
|
||||
"dialogs": {
|
||||
"finding_pets": {
|
||||
"title": "Finding the Pets",
|
||||
"participants": ["Tom", "Mary", "Sally", "Peter", "Betty", "Charlie"],
|
||||
"lines": [
|
||||
{ "speaker": "Tom", "text": "Where is the cat?", "user_language": "猫在哪里?" },
|
||||
{ "speaker": "Mary", "text": "It is on the chair.", "user_language": "它在椅子上。" },
|
||||
{ "speaker": "Sally", "text": "Where are the hamsters?", "user_language": "仓鼠在哪里?" },
|
||||
{ "speaker": "Peter", "text": "One is in the cupboard. One is near the sofa.", "user_language": "一只在橱柜里。一只在沙发附近。" },
|
||||
{ "speaker": "Betty", "text": "Where are the turtles?", "user_language": "乌龟在哪里?" },
|
||||
{ "speaker": "Charlie", "text": "They are under the sofa.", "user_language": "它们在沙发下面。" }
|
||||
]
|
||||
},
|
||||
"guessing_game": {
|
||||
"title": "Guessing Game",
|
||||
"participants": ["Teacher", "Student"],
|
||||
"lines": [
|
||||
{ "speaker": "Teacher", "text": "Close your eyes.", "user_language": "闭上你的眼睛。" },
|
||||
{ "speaker": "Teacher", "text": "Where is the rabbit?", "user_language": "兔子在哪里?" },
|
||||
{ "speaker": "Student", "text": "Is it under a desk?", "user_language": "它在桌子下面吗?" },
|
||||
{ "speaker": "Teacher", "text": "No, it isn't.", "user_language": "不,它不在。" },
|
||||
{ "speaker": "Student", "text": "Is it in a drawer?", "user_language": "它在抽屉里吗?" },
|
||||
{ "speaker": "Teacher", "text": "Yes, it is. Well done!", "user_language": "是的,它在。做得好!" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"texts": [
|
||||
{
|
||||
"title": "Where is Bob?",
|
||||
"original_language": "Ricky is Bob's dog. Ricky is sad. He cannot find Bob. Is Bob under the cupboard? No, he isn't. Where is Bob? Is he in the bag? No, Ricky. Bob isn't in the bag. Is Bob on the sofa? No, Bob isn't on the sofa. Come on, Ricky. Let's find Bob. Look, Ricky. Bob is on the bed! Ricky!",
|
||||
"user_language": "瑞奇是鲍勃的狗。瑞奇很伤心。他找不到鲍勃。鲍勃在橱柜下面吗?不,他不在。鲍勃在哪里?他在包里吗?不,瑞奇。鲍勃不在包里。鲍勃在沙发上吗?不,鲍勃不在沙发上。来吧,瑞奇。我们一起找鲍勃吧。看,瑞奇。鲍勃在床上!瑞奇!"
|
||||
}
|
||||
],
|
||||
"grammar": {
|
||||
"where-questions": {
|
||||
"title": "Where Questions",
|
||||
"explanation": "Use 'Where is...?' for singular and 'Where are...?' for plural to ask about location.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "Where is the cat?",
|
||||
"translation": "猫在哪里?",
|
||||
"explanation": "Use 'is' for singular subjects (the cat)"
|
||||
},
|
||||
{
|
||||
"english": "Where are the turtles?",
|
||||
"translation": "乌龟在哪里?",
|
||||
"explanation": "Use 'are' for plural subjects (the turtles)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prepositions-of-place": {
|
||||
"title": "Prepositions of Place",
|
||||
"explanation": "Prepositions tell us where something is located: in, on, under, near.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "The cat is on the chair",
|
||||
"translation": "猫在椅子上",
|
||||
"explanation": "Use 'on' for objects resting on a surface"
|
||||
},
|
||||
{
|
||||
"english": "The hamster is in the cupboard",
|
||||
"translation": "仓鼠在橱柜里",
|
||||
"explanation": "Use 'in' for being inside an enclosed space"
|
||||
},
|
||||
{
|
||||
"english": "The turtles are under the sofa",
|
||||
"translation": "乌龟在沙发下面",
|
||||
"explanation": "Use 'under' for being beneath something"
|
||||
},
|
||||
{
|
||||
"english": "One is near the sofa",
|
||||
"translation": "一只在沙发附近",
|
||||
"explanation": "Use 'near' for being close to something"
|
||||
}
|
||||
]
|
||||
},
|
||||
"yes-no-questions": {
|
||||
"title": "Yes/No Questions with Location",
|
||||
"explanation": "Use 'Is it...?' for singular and 'Are they...?' for plural yes/no questions about location.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "Is it in the box? - Yes, it is. / No, it isn't.",
|
||||
"translation": "它在盒子里吗?- 是的,它在。/ 不,它不在。",
|
||||
"explanation": "Use 'Is it' for singular, answer with 'Yes, it is' or 'No, it isn't'"
|
||||
},
|
||||
{
|
||||
"english": "Are they under the bed? - Yes, they are. / No, they aren't.",
|
||||
"translation": "它们在床下面吗?- 是的,它们在。/ 不,它们不在。",
|
||||
"explanation": "Use 'Are they' for plural, answer with 'Yes, they are' or 'No, they aren't'"
|
||||
}
|
||||
]
|
||||
},
|
||||
"contractions": {
|
||||
"title": "Contractions",
|
||||
"explanation": "Contractions combine two words into one: isn't = is not, aren't = are not, let's = let us.",
|
||||
"examples": [
|
||||
{
|
||||
"english": "isn't = is not",
|
||||
"translation": "不是(单数)",
|
||||
"explanation": "Negative contraction for 'is'"
|
||||
},
|
||||
{
|
||||
"english": "aren't = are not",
|
||||
"translation": "不是(复数)",
|
||||
"explanation": "Negative contraction for 'are'"
|
||||
},
|
||||
{
|
||||
"english": "Let's = Let us",
|
||||
"translation": "让我们",
|
||||
"explanation": "Suggestion contraction"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"fillInBlanks": [
|
||||
{
|
||||
"sentence": "The cat is ___ the chair",
|
||||
"options": ["on", "in", "under", "near"],
|
||||
"correctAnswer": "on",
|
||||
"explanation": "Use 'on' for objects resting on a surface",
|
||||
"grammarFocus": "prepositions-of-place"
|
||||
},
|
||||
{
|
||||
"sentence": "The hamster is ___ the cupboard",
|
||||
"options": ["in", "on", "under", "near"],
|
||||
"correctAnswer": "in",
|
||||
"explanation": "Use 'in' for being inside an enclosed space",
|
||||
"grammarFocus": "prepositions-of-place"
|
||||
},
|
||||
{
|
||||
"sentence": "The turtles are ___ the sofa",
|
||||
"options": ["under", "on", "in", "near"],
|
||||
"correctAnswer": "under",
|
||||
"explanation": "Use 'under' for being beneath something",
|
||||
"grammarFocus": "prepositions-of-place"
|
||||
},
|
||||
{
|
||||
"sentence": "One hamster is ___ the sofa",
|
||||
"options": ["near", "on", "in", "under"],
|
||||
"correctAnswer": "near",
|
||||
"explanation": "Use 'near' for being close to something",
|
||||
"grammarFocus": "prepositions-of-place"
|
||||
},
|
||||
{
|
||||
"sentence": "___ is the cat?",
|
||||
"options": ["Where", "What", "Who", "How"],
|
||||
"correctAnswer": "Where",
|
||||
"explanation": "Use 'Where' to ask about location",
|
||||
"grammarFocus": "where-questions"
|
||||
},
|
||||
{
|
||||
"sentence": "___ are the turtles?",
|
||||
"options": ["Where", "What", "Who", "How"],
|
||||
"correctAnswer": "Where",
|
||||
"explanation": "Use 'Where' to ask about location",
|
||||
"grammarFocus": "where-questions"
|
||||
},
|
||||
{
|
||||
"sentence": "Is Bob ___ the bag? No, he isn't",
|
||||
"options": ["in", "on", "under", "near"],
|
||||
"correctAnswer": "in",
|
||||
"explanation": "Use 'in' for being inside something like a bag",
|
||||
"grammarFocus": "prepositions-of-place"
|
||||
},
|
||||
{
|
||||
"sentence": "Bob is ___ the bed!",
|
||||
"options": ["on", "in", "under", "near"],
|
||||
"correctAnswer": "on",
|
||||
"explanation": "Use 'on' for being on top of a surface like a bed",
|
||||
"grammarFocus": "prepositions-of-place"
|
||||
},
|
||||
{
|
||||
"sentence": "Is it in the box? Yes, it ___",
|
||||
"options": ["is", "isn't", "are", "aren't"],
|
||||
"correctAnswer": "is",
|
||||
"explanation": "Answer 'Yes, it is' for affirmative singular",
|
||||
"grammarFocus": "yes-no-questions"
|
||||
},
|
||||
{
|
||||
"sentence": "Are they under the desk? No, they ___",
|
||||
"options": ["aren't", "are", "isn't", "is"],
|
||||
"correctAnswer": "aren't",
|
||||
"explanation": "Answer 'No, they aren't' for negative plural",
|
||||
"grammarFocus": "yes-no-questions"
|
||||
},
|
||||
{
|
||||
"sentence": "___ find Bob!",
|
||||
"options": ["Let's", "Lets", "Let", "Let us"],
|
||||
"correctAnswer": "Let's",
|
||||
"explanation": "Use the contraction 'Let's' for suggestions",
|
||||
"grammarFocus": "contractions"
|
||||
},
|
||||
{
|
||||
"sentence": "Ricky cannot ___ Bob",
|
||||
"options": ["find", "finds", "finding", "found"],
|
||||
"correctAnswer": "find",
|
||||
"explanation": "Use base form of verb after 'cannot'",
|
||||
"grammarFocus": "verbs"
|
||||
}
|
||||
],
|
||||
"corrections": [
|
||||
{
|
||||
"correct": "Where are the turtles?",
|
||||
"incorrect": "Where is the turtles?",
|
||||
"explanation": "Use 'are' with plural nouns like 'turtles'",
|
||||
"grammarFocus": "where-questions"
|
||||
},
|
||||
{
|
||||
"correct": "The cat is on the chair",
|
||||
"incorrect": "The cat are on the chair",
|
||||
"explanation": "Use 'is' with singular nouns like 'the cat'",
|
||||
"grammarFocus": "subject-verb-agreement"
|
||||
},
|
||||
{
|
||||
"correct": "Are they under the sofa?",
|
||||
"incorrect": "Is they under the sofa?",
|
||||
"explanation": "Use 'Are' with plural pronoun 'they'",
|
||||
"grammarFocus": "yes-no-questions"
|
||||
},
|
||||
{
|
||||
"correct": "Where is the dog?",
|
||||
"incorrect": "Where the dog is?",
|
||||
"explanation": "In questions, put 'is' before the subject after the question word",
|
||||
"grammarFocus": "question-formation"
|
||||
},
|
||||
{
|
||||
"correct": "Bob isn't in the bag",
|
||||
"incorrect": "Bob is not in the bag",
|
||||
"explanation": "Use the contraction 'isn't' instead of 'is not'",
|
||||
"grammarFocus": "contractions"
|
||||
},
|
||||
{
|
||||
"correct": "No, it isn't",
|
||||
"incorrect": "Yes, it isn't",
|
||||
"explanation": "Use 'No' with negative answers",
|
||||
"grammarFocus": "yes-no-questions"
|
||||
},
|
||||
{
|
||||
"correct": "The hamsters are in the cupboard",
|
||||
"incorrect": "The hamsters is in the cupboard",
|
||||
"explanation": "Use 'are' with plural nouns like 'hamsters'",
|
||||
"grammarFocus": "subject-verb-agreement"
|
||||
},
|
||||
{
|
||||
"correct": "It is on the shelf",
|
||||
"incorrect": "It are on the shelf",
|
||||
"explanation": "Use 'is' with singular pronoun 'it'",
|
||||
"grammarFocus": "subject-verb-agreement"
|
||||
}
|
||||
],
|
||||
"exercises": {
|
||||
"pet_location_practice": {
|
||||
"type": "location_practice",
|
||||
"instructions": "Ask and answer: Where is/are the pet(s)?",
|
||||
"items": [
|
||||
{ "question": "Where is the cat?", "answer": "It is on the chair.", "user_language_q": "猫在哪里?", "user_language_a": "它在椅子上。" },
|
||||
{ "question": "Where are the turtles?", "answer": "They are under the sofa.", "user_language_q": "乌龟在哪里?", "user_language_a": "它们在沙发下面。" },
|
||||
{ "question": "Where is the hamster?", "answer": "It is in the cupboard.", "user_language_q": "仓鼠在哪里?", "user_language_a": "它在橱柜里。" },
|
||||
{ "question": "Where is the rabbit?", "answer": "It is in the drawer.", "user_language_q": "兔子在哪里?", "user_language_a": "它在抽屉里。" }
|
||||
]
|
||||
},
|
||||
"story_comprehension": {
|
||||
"type": "true_false",
|
||||
"instructions": "Where is Bob? - True or False?",
|
||||
"items": [
|
||||
{ "statement": "Bob is in the bag", "answer": false, "user_language": "鲍勃在包里" },
|
||||
{ "statement": "Bob is on the sofa", "answer": false, "user_language": "鲍勃在沙发上" },
|
||||
{ "statement": "Bob is under the cupboard", "answer": false, "user_language": "鲍勃在橱柜下面" },
|
||||
{ "statement": "Bob is on the bed", "answer": true, "user_language": "鲍勃在床上" },
|
||||
{ "statement": "Ricky is sad", "answer": true, "user_language": "瑞奇很伤心" },
|
||||
{ "statement": "Ricky can find Bob easily", "answer": false, "user_language": "瑞奇很容易找到鲍勃" }
|
||||
]
|
||||
},
|
||||
"letter_matching": {
|
||||
"type": "matching",
|
||||
"instructions": "Match each word with the correct starting letter",
|
||||
"items": [
|
||||
{ "word": "wolf", "letter": "W", "user_language": "狼" },
|
||||
{ "word": "fox", "letter": "X", "user_language": "狐狸" },
|
||||
{ "word": "yo-yo", "letter": "Y", "user_language": "悠悠球" },
|
||||
{ "word": "zebra", "letter": "Z", "user_language": "斑马" },
|
||||
{ "word": "water", "letter": "W", "user_language": "水" },
|
||||
{ "word": "box", "letter": "X", "user_language": "盒子" },
|
||||
{ "word": "yacht", "letter": "Y", "user_language": "游艇" },
|
||||
{ "word": "zoo", "letter": "Z", "user_language": "动物园" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"thematic_questions": {
|
||||
"location_questions_furniture": [
|
||||
{
|
||||
"id": "tq1",
|
||||
"question": "Where is the cat?",
|
||||
"question_user_language": "猫在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It is on the chair.",
|
||||
"The cat is on the chair.",
|
||||
"On the chair."
|
||||
],
|
||||
"theme": "location_questions_furniture"
|
||||
},
|
||||
{
|
||||
"id": "tq2",
|
||||
"question": "Where are the turtles?",
|
||||
"question_user_language": "乌龟在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"They are under the sofa.",
|
||||
"The turtles are under the sofa.",
|
||||
"Under the sofa."
|
||||
],
|
||||
"theme": "location_questions_furniture"
|
||||
},
|
||||
{
|
||||
"id": "tq3",
|
||||
"question": "Where is the hamster?",
|
||||
"question_user_language": "仓鼠在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It is in the cupboard.",
|
||||
"The hamster is in the cupboard.",
|
||||
"In the cupboard."
|
||||
],
|
||||
"theme": "location_questions_furniture"
|
||||
},
|
||||
{
|
||||
"id": "tq4",
|
||||
"question": "Where is the book?",
|
||||
"question_user_language": "书在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It is on the table.",
|
||||
"The book is on the table.",
|
||||
"On the table."
|
||||
],
|
||||
"theme": "location_questions_furniture"
|
||||
},
|
||||
{
|
||||
"id": "tq5",
|
||||
"question": "Where is the bag?",
|
||||
"question_user_language": "包在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It is near the sofa.",
|
||||
"The bag is near the sofa.",
|
||||
"Near the sofa."
|
||||
],
|
||||
"theme": "location_questions_furniture"
|
||||
}
|
||||
],
|
||||
"yes_no_location": [
|
||||
{
|
||||
"id": "tq6",
|
||||
"question": "Is the cat on the chair?",
|
||||
"question_user_language": "猫在椅子上吗?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Yes, it is.",
|
||||
"Yes, the cat is on the chair.",
|
||||
"Yes."
|
||||
],
|
||||
"theme": "yes_no_location"
|
||||
},
|
||||
{
|
||||
"id": "tq7",
|
||||
"question": "Is Bob in the bag?",
|
||||
"question_user_language": "鲍勃在包里吗?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"No, he isn't.",
|
||||
"No, Bob isn't in the bag.",
|
||||
"No."
|
||||
],
|
||||
"theme": "yes_no_location"
|
||||
},
|
||||
{
|
||||
"id": "tq8",
|
||||
"question": "Are the turtles under the sofa?",
|
||||
"question_user_language": "乌龟在沙发下面吗?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Yes, they are.",
|
||||
"Yes, the turtles are under the sofa.",
|
||||
"Yes."
|
||||
],
|
||||
"theme": "yes_no_location"
|
||||
},
|
||||
{
|
||||
"id": "tq9",
|
||||
"question": "Is the rabbit in the drawer?",
|
||||
"question_user_language": "兔子在抽屉里吗?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Yes, it is.",
|
||||
"Yes, the rabbit is in the drawer.",
|
||||
"Yes."
|
||||
],
|
||||
"theme": "yes_no_location"
|
||||
},
|
||||
{
|
||||
"id": "tq10",
|
||||
"question": "Is the dog under the desk?",
|
||||
"question_user_language": "狗在桌子下面吗?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"No, it isn't.",
|
||||
"No, the dog isn't under the desk.",
|
||||
"No."
|
||||
],
|
||||
"theme": "yes_no_location"
|
||||
}
|
||||
],
|
||||
"story_comprehension": [
|
||||
{
|
||||
"id": "tq11",
|
||||
"question": "Who is Bob's dog?",
|
||||
"question_user_language": "谁是鲍勃的狗?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Ricky is Bob's dog.",
|
||||
"Ricky.",
|
||||
"His name is Ricky."
|
||||
],
|
||||
"theme": "story_comprehension"
|
||||
},
|
||||
{
|
||||
"id": "tq12",
|
||||
"question": "How does Ricky feel?",
|
||||
"question_user_language": "瑞奇感觉怎么样?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Ricky is sad.",
|
||||
"He is sad.",
|
||||
"Sad."
|
||||
],
|
||||
"theme": "story_comprehension"
|
||||
},
|
||||
{
|
||||
"id": "tq13",
|
||||
"question": "Where is Bob at the end of the story?",
|
||||
"question_user_language": "故事最后鲍勃在哪里?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Bob is on the bed.",
|
||||
"He is on the bed.",
|
||||
"On the bed."
|
||||
],
|
||||
"theme": "story_comprehension"
|
||||
},
|
||||
{
|
||||
"id": "tq14",
|
||||
"question": "What does Ricky want to find?",
|
||||
"question_user_language": "瑞奇想找什么?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Ricky wants to find Bob.",
|
||||
"He wants to find Bob.",
|
||||
"Bob."
|
||||
],
|
||||
"theme": "story_comprehension"
|
||||
}
|
||||
],
|
||||
"vocabulary_letters": [
|
||||
{
|
||||
"id": "tq15",
|
||||
"question": "What letter does 'wolf' start with?",
|
||||
"question_user_language": "'wolf' 以什么字母开头?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It starts with W.",
|
||||
"W.",
|
||||
"The letter W."
|
||||
],
|
||||
"theme": "vocabulary_letters"
|
||||
},
|
||||
{
|
||||
"id": "tq16",
|
||||
"question": "What letter does 'zebra' start with?",
|
||||
"question_user_language": "'zebra' 以什么字母开头?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"It starts with Z.",
|
||||
"Z.",
|
||||
"The letter Z."
|
||||
],
|
||||
"theme": "vocabulary_letters"
|
||||
},
|
||||
{
|
||||
"id": "tq17",
|
||||
"question": "What word starts with Y?",
|
||||
"question_user_language": "什么单词以 Y 开头?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Yo-yo starts with Y.",
|
||||
"Yo-yo.",
|
||||
"Yacht."
|
||||
],
|
||||
"theme": "vocabulary_letters"
|
||||
},
|
||||
{
|
||||
"id": "tq18",
|
||||
"question": "Can you name something that has the letter X?",
|
||||
"question_user_language": "你能说出一个含有字母 X 的单词吗?",
|
||||
"tts_enabled": true,
|
||||
"example_responses": [
|
||||
"Box has the letter X.",
|
||||
"Box.",
|
||||
"Fox.",
|
||||
"Six."
|
||||
],
|
||||
"theme": "vocabulary_letters"
|
||||
}
|
||||
]
|
||||
},
|
||||
"statistics": {
|
||||
"vocabulary_count": 41,
|
||||
"phrases_count": 17,
|
||||
"dialogs_count": 2,
|
||||
"texts_count": 1,
|
||||
"exercises_count": 3,
|
||||
"fillInBlanks_count": 12,
|
||||
"corrections_count": 8,
|
||||
"thematic_questions_count": 18,
|
||||
"estimated_completion_time": 4
|
||||
}
|
||||
}
|
||||
@ -27,6 +27,7 @@ class GameLoader extends Module {
|
||||
'../games/StoryReader.js',
|
||||
'../games/LetterDiscovery.js',
|
||||
'../games/QuizGame.js',
|
||||
'../games/ThematicQuestions.js',
|
||||
'../games/AdventureReader.js',
|
||||
'../games/WizardSpellCaster.js',
|
||||
'../games/WordStorm.js',
|
||||
@ -34,11 +35,11 @@ class GameLoader extends Module {
|
||||
'../games/WordDiscovery.js',
|
||||
'../games/GrammarDiscovery.js',
|
||||
'../games/FillTheBlank.js',
|
||||
'../games/StoryBuilder.js',
|
||||
'../games/RiverRun.js',
|
||||
'../games/ChineseStudy.js',
|
||||
'../games/WhackAMoleHard.js',
|
||||
'../games/MarioEducational.js'
|
||||
'../games/MarioEducational.js',
|
||||
'../games/SentenceInvaders.js'
|
||||
// All current games with Module architecture
|
||||
];
|
||||
|
||||
|
||||
@ -157,11 +157,36 @@ export class PhysicsEngine {
|
||||
}
|
||||
});
|
||||
|
||||
// Boulder collisions (grounded boulders only)
|
||||
// Boulder collisions (grounded boulders act as solid platforms)
|
||||
boulders.forEach(boulder => {
|
||||
if (boulder.hasLanded && this.isColliding(mario, boulder)) {
|
||||
console.log(`🪨 Mario hit by grounded boulder - restarting level`);
|
||||
if (onMarioDeath) onMarioDeath();
|
||||
// Determine collision direction based on overlap
|
||||
const overlapLeft = (mario.x + mario.width) - boulder.x;
|
||||
const overlapRight = (boulder.x + boulder.width) - mario.x;
|
||||
const overlapTop = (mario.y + mario.height) - boulder.y;
|
||||
const overlapBottom = (boulder.y + boulder.height) - mario.y;
|
||||
|
||||
// Find the smallest overlap to determine collision side
|
||||
const minOverlap = Math.min(overlapLeft, overlapRight, overlapTop, overlapBottom);
|
||||
|
||||
if (minOverlap === overlapTop && mario.velocityY > 0) {
|
||||
// Landing on top of boulder
|
||||
mario.y = boulder.y - mario.height;
|
||||
mario.velocityY = 0;
|
||||
mario.onGround = true;
|
||||
} else if (minOverlap === overlapBottom && mario.velocityY < 0) {
|
||||
// Hitting boulder from below
|
||||
mario.y = boulder.y + boulder.height;
|
||||
mario.velocityY = 0;
|
||||
} else if (minOverlap === overlapLeft && mario.velocityX > 0) {
|
||||
// Hitting boulder from left
|
||||
mario.x = boulder.x - mario.width;
|
||||
mario.velocityX = 0;
|
||||
} else if (minOverlap === overlapRight && mario.velocityX < 0) {
|
||||
// Hitting boulder from right
|
||||
mario.x = boulder.x + boulder.width;
|
||||
mario.velocityX = 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@ -224,7 +224,7 @@ export class Renderer {
|
||||
return;
|
||||
}
|
||||
|
||||
const pipeHeight = 40; // Reduced from 60
|
||||
const pipeHeight = 25; // Much smaller pipe
|
||||
const pipeY = plant.y + plant.height - pipeHeight;
|
||||
|
||||
// Pipe
|
||||
@ -233,18 +233,18 @@ export class Renderer {
|
||||
|
||||
// Pipe rim
|
||||
ctx.fillStyle = '#3A9F3A';
|
||||
ctx.fillRect(plant.x - 3, pipeY, plant.width + 6, 8); // Reduced from -5, +10, 10
|
||||
ctx.fillRect(plant.x - 2, pipeY, plant.width + 4, 5);
|
||||
|
||||
// Pipe border
|
||||
ctx.strokeStyle = '#000';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.lineWidth = 1;
|
||||
ctx.strokeRect(plant.x, pipeY, plant.width, pipeHeight);
|
||||
ctx.strokeRect(plant.x - 3, pipeY, plant.width + 6, 8);
|
||||
ctx.strokeRect(plant.x - 2, pipeY, plant.width + 4, 5);
|
||||
|
||||
// Plant head (if extended)
|
||||
if (plant.extended > 0) {
|
||||
const headY = pipeY - plant.extended;
|
||||
const headSize = 20; // Reduced from 30
|
||||
const headSize = 10; // Much smaller head (radius, so diameter = 20px)
|
||||
|
||||
// Head
|
||||
ctx.fillStyle = '#FF0000';
|
||||
@ -256,20 +256,20 @@ export class Renderer {
|
||||
// Spots
|
||||
ctx.fillStyle = '#FFF';
|
||||
ctx.beginPath();
|
||||
ctx.arc(plant.x + plant.width / 2 - 7, headY - 3, 4, 0, Math.PI * 2);
|
||||
ctx.arc(plant.x + plant.width / 2 + 7, headY - 3, 4, 0, Math.PI * 2);
|
||||
ctx.arc(plant.x + plant.width / 2 - 4, headY - 2, 2, 0, Math.PI * 2);
|
||||
ctx.arc(plant.x + plant.width / 2 + 4, headY - 2, 2, 0, Math.PI * 2);
|
||||
ctx.fill();
|
||||
|
||||
// Mouth (open/close animation)
|
||||
const mouthOpen = Math.sin(Date.now() / 200) > 0;
|
||||
if (mouthOpen) {
|
||||
ctx.fillStyle = '#000';
|
||||
ctx.fillRect(plant.x + plant.width / 2 - 8, headY + 5, 16, 6);
|
||||
ctx.fillRect(plant.x + plant.width / 2 - 5, headY + 3, 10, 3);
|
||||
}
|
||||
|
||||
// Stem
|
||||
ctx.fillStyle = '#2D882D';
|
||||
ctx.fillRect(plant.x + plant.width / 2 - 3, headY, 6, plant.extended);
|
||||
ctx.fillRect(plant.x + plant.width / 2 - 2, headY, 4, plant.extended);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -318,26 +318,46 @@ export class Renderer {
|
||||
*/
|
||||
renderBoulders(ctx, boulders) {
|
||||
boulders.forEach(boulder => {
|
||||
// Boulder body
|
||||
ctx.fillStyle = '#808080';
|
||||
ctx.beginPath();
|
||||
ctx.arc(boulder.x, boulder.y, boulder.radius, 0, Math.PI * 2);
|
||||
ctx.fill();
|
||||
// Support both circle (radius) and rectangle (width/height) boulders
|
||||
if (boulder.radius) {
|
||||
// Circle boulder
|
||||
ctx.fillStyle = boulder.color || '#808080';
|
||||
ctx.beginPath();
|
||||
ctx.arc(boulder.x, boulder.y, boulder.radius, 0, Math.PI * 2);
|
||||
ctx.fill();
|
||||
|
||||
// Cracks/texture
|
||||
ctx.strokeStyle = '#606060';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(boulder.x - boulder.radius * 0.5, boulder.y - boulder.radius * 0.3);
|
||||
ctx.lineTo(boulder.x + boulder.radius * 0.5, boulder.y + boulder.radius * 0.3);
|
||||
ctx.stroke();
|
||||
// Cracks/texture
|
||||
ctx.strokeStyle = '#606060';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(boulder.x - boulder.radius * 0.5, boulder.y - boulder.radius * 0.3);
|
||||
ctx.lineTo(boulder.x + boulder.radius * 0.5, boulder.y + boulder.radius * 0.3);
|
||||
ctx.stroke();
|
||||
|
||||
// Border
|
||||
ctx.strokeStyle = '#000';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.beginPath();
|
||||
ctx.arc(boulder.x, boulder.y, boulder.radius, 0, Math.PI * 2);
|
||||
ctx.stroke();
|
||||
// Border
|
||||
ctx.strokeStyle = '#000';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.beginPath();
|
||||
ctx.arc(boulder.x, boulder.y, boulder.radius, 0, Math.PI * 2);
|
||||
ctx.stroke();
|
||||
} else {
|
||||
// Rectangle boulder (parabolic arc style)
|
||||
ctx.fillStyle = boulder.color || '#696969';
|
||||
ctx.fillRect(boulder.x, boulder.y, boulder.width, boulder.height);
|
||||
|
||||
// Cracks/texture
|
||||
ctx.strokeStyle = '#505050';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(boulder.x + boulder.width * 0.2, boulder.y + boulder.height * 0.3);
|
||||
ctx.lineTo(boulder.x + boulder.width * 0.8, boulder.y + boulder.height * 0.7);
|
||||
ctx.stroke();
|
||||
|
||||
// Border
|
||||
ctx.strokeStyle = '#000';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.strokeRect(boulder.x, boulder.y, boulder.width, boulder.height);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -524,8 +544,8 @@ export class Renderer {
|
||||
ctx.lineWidth = 2;
|
||||
ctx.font = 'bold 16px Arial';
|
||||
ctx.textAlign = 'center';
|
||||
ctx.strokeText(`${currentLevel + 1}`, finishLine.x + 35, finishLine.y + 25);
|
||||
ctx.fillText(`${currentLevel + 1}`, finishLine.x + 35, finishLine.y + 25);
|
||||
ctx.strokeText(`${currentLevel}`, finishLine.x + 35, finishLine.y + 25);
|
||||
ctx.fillText(`${currentLevel}`, finishLine.x + 35, finishLine.y + 25);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -578,10 +598,6 @@ export class Renderer {
|
||||
// Text style
|
||||
ctx.fillStyle = '#FFF';
|
||||
ctx.font = 'bold 16px Arial';
|
||||
ctx.textAlign = 'left';
|
||||
|
||||
// Lives
|
||||
ctx.fillText(`❤️ Lives: ${gameState.lives}`, 10, 25);
|
||||
|
||||
// Score
|
||||
ctx.textAlign = 'center';
|
||||
@ -589,7 +605,7 @@ export class Renderer {
|
||||
|
||||
// Level
|
||||
ctx.textAlign = 'right';
|
||||
ctx.fillText(`Level: ${gameState.currentLevel + 1}`, config.canvasWidth - 10, 25);
|
||||
ctx.fillText(`Level: ${gameState.currentLevel}`, config.canvasWidth - 10, 25);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -150,7 +150,7 @@ export class Catapult {
|
||||
* @param {Array} stones - Stones array (for onagers)
|
||||
* @param {Function} playSound - Sound callback
|
||||
*/
|
||||
static update(catapults, mario, boulders, stones, playSound) {
|
||||
static update(catapults, mario, boulders, stones, playSound, canvasHeight) {
|
||||
const currentTime = Date.now();
|
||||
|
||||
catapults.forEach(catapult => {
|
||||
@ -159,56 +159,82 @@ export class Catapult {
|
||||
|
||||
// Check if it's time to shoot
|
||||
if (currentTime - catapult.lastShot > catapult.shootCooldown) {
|
||||
const distanceToMario = Math.abs(catapult.x - mario.x);
|
||||
// ONAGER: Check minimum range - don't fire if Mario is too close
|
||||
if (catapult.isOnager) {
|
||||
const distanceToMario = Math.abs(catapult.x - mario.x);
|
||||
const minimumRange = 300;
|
||||
|
||||
// Catapult shoots boulders (single target)
|
||||
if (!catapult.isOnager && distanceToMario < 600) {
|
||||
// Calculate trajectory to Mario
|
||||
const dx = mario.x - catapult.x;
|
||||
const dy = mario.y - catapult.y;
|
||||
const distance = Math.sqrt(dx * dx + dy * dy);
|
||||
|
||||
const speed = 8;
|
||||
const velocityX = (dx / distance) * speed;
|
||||
const velocityY = (dy / distance) * speed;
|
||||
|
||||
boulders.push({
|
||||
x: catapult.x + catapult.width / 2,
|
||||
y: catapult.y,
|
||||
velocityX: velocityX,
|
||||
velocityY: velocityY,
|
||||
radius: 20,
|
||||
type: 'boulder',
|
||||
launched: true
|
||||
});
|
||||
|
||||
catapult.lastShot = currentTime;
|
||||
if (playSound) playSound('jump'); // Boulder launch sound
|
||||
console.log(`🪨 Catapult launched boulder towards Mario!`);
|
||||
if (distanceToMario < minimumRange) {
|
||||
console.log(`🏛️ Onager held fire - Mario too close! Distance: ${distanceToMario.toFixed(0)}px`);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Onager shoots stone rain (area attack)
|
||||
else if (catapult.isOnager && distanceToMario < 800) {
|
||||
// Create stone rain above Mario's area
|
||||
const stoneCount = 8 + Math.floor(Math.random() * 5); // 8-12 stones
|
||||
|
||||
for (let i = 0; i < stoneCount; i++) {
|
||||
const offsetX = (Math.random() - 0.5) * 400; // Spread 400px around Mario
|
||||
// Target Mario's position with imperfect aim
|
||||
const aimOffset = 100 + Math.random() * 150; // 100-250 pixel spread
|
||||
const aimDirection = Math.random() < 0.5 ? -1 : 1;
|
||||
const targetX = mario.x + (aimOffset * aimDirection);
|
||||
const targetY = canvasHeight - 50; // Ground level
|
||||
|
||||
if (catapult.isOnager) {
|
||||
// ONAGER: Fire 8 small stones in spread pattern with parabolic trajectory
|
||||
for (let stone = 0; stone < 8; stone++) {
|
||||
const randomSpreadX = (Math.random() - 0.5) * 400; // ±200px spread
|
||||
const randomSpreadY = (Math.random() - 0.5) * 100; // ±50px spread
|
||||
const stoneTargetX = targetX + randomSpreadX;
|
||||
const stoneTargetY = targetY + randomSpreadY;
|
||||
|
||||
// Calculate parabolic trajectory
|
||||
const deltaX = stoneTargetX - catapult.x;
|
||||
const deltaY = stoneTargetY - catapult.y;
|
||||
const time = 5 + Math.random() * 2; // 5-7 seconds flight time
|
||||
const velocityX = deltaX / (time * 60);
|
||||
const velocityY = (deltaY - 0.5 * 0.015 * time * time * 60 * 60) / (time * 60);
|
||||
|
||||
stones.push({
|
||||
x: mario.x + offsetX,
|
||||
y: -50 - Math.random() * 100, // Start above screen
|
||||
velocityX: (Math.random() - 0.5) * 2,
|
||||
velocityY: 2 + Math.random() * 3,
|
||||
width: 15 + Math.random() * 10,
|
||||
height: 15 + Math.random() * 10,
|
||||
x: catapult.x + 30 + (Math.random() - 0.5) * 20,
|
||||
y: catapult.y - 10 + (Math.random() - 0.5) * 10,
|
||||
width: 8,
|
||||
height: 8,
|
||||
velocityX: velocityX,
|
||||
velocityY: velocityY,
|
||||
color: '#A0522D',
|
||||
type: 'stone',
|
||||
rotation: Math.random() * Math.PI * 2
|
||||
sourceCatapultX: catapult.x,
|
||||
sourceCatapultY: catapult.y
|
||||
});
|
||||
}
|
||||
|
||||
catapult.lastShot = currentTime;
|
||||
if (playSound) playSound('enemy_defeat'); // Different sound for stone rain
|
||||
console.log(`☄️ Onager launched stone rain (${stoneCount} stones)!`);
|
||||
if (playSound) playSound('enemy_defeat');
|
||||
console.log(`🏛️ Onager fired 8 stones in spread pattern!`);
|
||||
} else {
|
||||
// CATAPULT: Fire single boulder with parabolic trajectory
|
||||
const deltaX = targetX - catapult.x;
|
||||
const deltaY = targetY - catapult.y;
|
||||
const time = 7.5; // 7.5 seconds flight time
|
||||
const velocityX = deltaX / (time * 60);
|
||||
const velocityY = (deltaY - 0.5 * 0.01 * time * time * 60 * 60) / (time * 60);
|
||||
|
||||
boulders.push({
|
||||
x: catapult.x + 30,
|
||||
y: catapult.y - 10,
|
||||
width: 25,
|
||||
height: 25,
|
||||
velocityX: velocityX,
|
||||
velocityY: velocityY,
|
||||
color: '#696969',
|
||||
type: 'boulder',
|
||||
hasLanded: false,
|
||||
sourceCatapultX: catapult.x,
|
||||
sourceCatapultY: catapult.y,
|
||||
health: 2,
|
||||
maxHealth: 2
|
||||
});
|
||||
|
||||
catapult.lastShot = currentTime;
|
||||
if (playSound) playSound('jump');
|
||||
console.log(`🏹 Catapult fired boulder towards x=${targetX.toFixed(0)}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -224,52 +250,69 @@ export class Catapult {
|
||||
* @returns {Array} - Updated boulders array
|
||||
*/
|
||||
static updateBoulders(boulders, mario, platforms, walls, onImpact) {
|
||||
const GRAVITY = 0.3;
|
||||
const updatedBoulders = [];
|
||||
if (!boulders || !Array.isArray(boulders)) return;
|
||||
|
||||
const GRAVITY = 0.01; // Ultra-light gravity for parabolic arc
|
||||
const canvasHeight = 690; // Default canvas height
|
||||
|
||||
// Iterate backwards to safely remove boulders
|
||||
for (let index = boulders.length - 1; index >= 0; index--) {
|
||||
const boulder = boulders[index];
|
||||
|
||||
if (boulder.hasLanded) continue; // Don't update landed boulders
|
||||
|
||||
boulders.forEach((boulder, index) => {
|
||||
// Apply physics
|
||||
boulder.velocityY += GRAVITY;
|
||||
boulder.x += boulder.velocityX;
|
||||
boulder.y += boulder.velocityY;
|
||||
|
||||
// Check ground collision
|
||||
const groundLevel = canvasHeight - 50;
|
||||
if (boulder.y + boulder.height >= groundLevel) {
|
||||
if (onImpact) {
|
||||
onImpact(boulder, index, boulder.x, groundLevel - boulder.height, null, -1, 'ground');
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
let hasHit = false;
|
||||
|
||||
// Check collision with platforms
|
||||
let hitPlatform = false;
|
||||
platforms.forEach((platform, platformIndex) => {
|
||||
if (this._isCollidingCircleRect(boulder, platform)) {
|
||||
hitPlatform = true;
|
||||
if (!hasHit && this._isCollidingRectRect(boulder, platform)) {
|
||||
if (onImpact) {
|
||||
onImpact(boulder, index, boulder.x, boulder.y, platform, platformIndex, 'platform');
|
||||
onImpact(boulder, index, boulder.x, platform.y - boulder.height, platform, platformIndex, 'platform');
|
||||
}
|
||||
hasHit = true;
|
||||
}
|
||||
});
|
||||
|
||||
// Check collision with walls
|
||||
let hitWall = false;
|
||||
walls.forEach((wall, wallIndex) => {
|
||||
if (this._isCollidingCircleRect(boulder, wall)) {
|
||||
hitWall = true;
|
||||
if (onImpact) {
|
||||
onImpact(boulder, index, boulder.x, boulder.y, wall, wallIndex, 'wall');
|
||||
// Check collision with walls (boulder destroys wall)
|
||||
if (!hasHit) {
|
||||
walls.forEach((wall, wallIndex) => {
|
||||
if (!hasHit && this._isCollidingRectRect(boulder, wall)) {
|
||||
if (onImpact) {
|
||||
onImpact(boulder, index, boulder.x, boulder.y, wall, wallIndex, 'wall');
|
||||
}
|
||||
hasHit = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Check collision with Mario
|
||||
if (this._isCollidingCircleRect(boulder, mario)) {
|
||||
if (!hasHit && this._isCollidingRectRect(boulder, mario)) {
|
||||
if (onImpact) {
|
||||
onImpact(boulder, index, boulder.x, boulder.y, mario, -1, 'mario');
|
||||
}
|
||||
return; // Remove boulder
|
||||
hasHit = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Remove if out of bounds or hit something
|
||||
if (!hitPlatform && !hitWall && boulder.y < 1000) {
|
||||
updatedBoulders.push(boulder);
|
||||
// Remove boulders that go off-screen
|
||||
if (boulder.x < -100 || boulder.x > 4000 || boulder.y > canvasHeight + 100) {
|
||||
boulders.splice(index, 1);
|
||||
}
|
||||
});
|
||||
|
||||
return updatedBoulders;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -281,7 +324,10 @@ export class Catapult {
|
||||
* @returns {Array} - Updated stones array
|
||||
*/
|
||||
static updateStones(stones, mario, platforms, onImpact) {
|
||||
const GRAVITY = 0.5;
|
||||
if (!stones || !Array.isArray(stones)) return [];
|
||||
|
||||
const GRAVITY = 0.015; // Lighter gravity for parabolic arc
|
||||
const canvasHeight = 690;
|
||||
const updatedStones = [];
|
||||
|
||||
stones.forEach((stone, index) => {
|
||||
@ -289,29 +335,39 @@ export class Catapult {
|
||||
stone.velocityY += GRAVITY;
|
||||
stone.x += stone.velocityX;
|
||||
stone.y += stone.velocityY;
|
||||
stone.rotation += 0.1;
|
||||
|
||||
// Check ground collision
|
||||
const groundLevel = canvasHeight - 50;
|
||||
if (stone.y + stone.height >= groundLevel) {
|
||||
if (onImpact) {
|
||||
onImpact(stone, index, 'ground');
|
||||
}
|
||||
return; // Don't keep this stone
|
||||
}
|
||||
|
||||
let hasHit = false;
|
||||
|
||||
// Check collision with platforms
|
||||
let hitPlatform = false;
|
||||
platforms.forEach(platform => {
|
||||
if (this._isCollidingRectRect(stone, platform)) {
|
||||
hitPlatform = true;
|
||||
if (!hasHit && this._isCollidingRectRect(stone, platform)) {
|
||||
if (onImpact) {
|
||||
onImpact(stone, index, 'platform');
|
||||
}
|
||||
hasHit = true;
|
||||
}
|
||||
});
|
||||
|
||||
// Check collision with Mario
|
||||
if (this._isCollidingRectRect(stone, mario)) {
|
||||
if (!hasHit && this._isCollidingRectRect(stone, mario)) {
|
||||
if (onImpact) {
|
||||
onImpact(stone, index, 'mario');
|
||||
}
|
||||
return; // Remove stone
|
||||
hasHit = true;
|
||||
return; // Don't keep this stone
|
||||
}
|
||||
|
||||
// Keep stone if not hit and still on screen
|
||||
if (!hitPlatform && stone.y < 1000) {
|
||||
if (!hasHit && stone.x >= -100 && stone.x <= 4000 && stone.y <= canvasHeight + 100) {
|
||||
updatedStones.push(stone);
|
||||
}
|
||||
});
|
||||
|
||||
@ -57,16 +57,8 @@ export class PiranhaPlant {
|
||||
const currentTime = Date.now();
|
||||
|
||||
plants.forEach(plant => {
|
||||
// If plant is flattened, count down and make it a platform
|
||||
// If plant is flattened, it stays dead permanently
|
||||
if (plant.flattened) {
|
||||
if (plant.flattenedTimer > 0) {
|
||||
plant.flattenedTimer--;
|
||||
} else {
|
||||
// Plant recovers after timer expires
|
||||
plant.flattened = false;
|
||||
plant.extended = 0;
|
||||
plant.extending = true;
|
||||
}
|
||||
return; // Don't animate or shoot while flattened
|
||||
}
|
||||
|
||||
@ -122,9 +114,9 @@ export class PiranhaPlant {
|
||||
if (!plant.visible) continue;
|
||||
|
||||
// Only check collision when plant is extended
|
||||
if (plant.extended > 15) {
|
||||
if (plant.extended > 10) {
|
||||
const headY = plant.y - plant.extended;
|
||||
const headRadius = 20;
|
||||
const headRadius = 10;
|
||||
|
||||
// Simple circle-rectangle collision
|
||||
const closestX = Math.max(mario.x, Math.min(plant.x + plant.width / 2, mario.x + mario.width));
|
||||
|
||||
@ -423,7 +423,7 @@ class AdventureReader extends Module {
|
||||
style.id = cssId;
|
||||
style.textContent = `
|
||||
.adventure-reader-wrapper {
|
||||
height: 100vh;
|
||||
height: 75vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
|
||||
@ -51,6 +51,11 @@ class ChineseStudy extends Module {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Only compatible with Chinese content
|
||||
if (content.language !== 'zh-CN') {
|
||||
return 0;
|
||||
}
|
||||
|
||||
let score = 30;
|
||||
|
||||
if (typeof content.vocabulary === 'object') {
|
||||
|
||||
@ -781,19 +781,22 @@ class GrammarDiscovery extends Module {
|
||||
💡 Simple Examples
|
||||
</div>
|
||||
<div class="examples-section">
|
||||
${this._simpleExamples.map((example, index) => `
|
||||
${this._simpleExamples.map((example, index) => {
|
||||
const text = example.chinese || example.text || example.sentence || '';
|
||||
const safeText = text.replace(/'/g, "\\'");
|
||||
return `
|
||||
<div class="example-item revealed" id="simple-example-${index}">
|
||||
<div class="chinese-text">${example.chinese || example.text || example.sentence}</div>
|
||||
<div class="english-text">${example.english || example.translation}</div>
|
||||
<div class="chinese-text">${text}</div>
|
||||
<div class="english-text">${example.english || example.translation || ''}</div>
|
||||
<div class="pronunciation">${example.pronunciation || example.prononciation || ''}</div>
|
||||
<div class="explanation-text">${example.explanation || example.breakdown || ''}</div>
|
||||
<div class="tts-controls">
|
||||
<button class="tts-btn" onclick="window.currentGrammarGame._speakText('${(example.chinese || example.text || example.sentence).replace(/'/g, "\\'")}')">
|
||||
<button class="tts-btn" onclick="window.currentGrammarGame._speakText('${safeText}')">
|
||||
🔊 Pronunciation
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
`).join('')}
|
||||
`;}).join('')}
|
||||
</div>
|
||||
|
||||
<div class="discovery-controls">
|
||||
@ -870,19 +873,22 @@ class GrammarDiscovery extends Module {
|
||||
🧩 Complex Examples
|
||||
</div>
|
||||
<div class="examples-section">
|
||||
${this._complexExamples.map((example, index) => `
|
||||
${this._complexExamples.map((example, index) => {
|
||||
const text = example.chinese || example.text || example.sentence || '';
|
||||
const safeText = text.replace(/'/g, "\\'");
|
||||
return `
|
||||
<div class="example-item revealed" id="complex-example-${index}">
|
||||
<div class="chinese-text">${example.chinese || example.text || example.sentence}</div>
|
||||
<div class="english-text">${example.english || example.translation}</div>
|
||||
<div class="chinese-text">${text}</div>
|
||||
<div class="english-text">${example.english || example.translation || ''}</div>
|
||||
<div class="pronunciation">${example.pronunciation || example.prononciation || ''}</div>
|
||||
<div class="explanation-text">${example.explanation || example.breakdown || ''}</div>
|
||||
<div class="tts-controls">
|
||||
<button class="tts-btn" onclick="window.currentGrammarGame._speakText('${(example.chinese || example.text || example.sentence).replace(/'/g, "\\'")}')">
|
||||
<button class="tts-btn" onclick="window.currentGrammarGame._speakText('${safeText}')">
|
||||
🔊 Pronunciation
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
`).join('')}
|
||||
`;}).join('')}
|
||||
</div>
|
||||
|
||||
<div class="discovery-controls">
|
||||
|
||||
@ -71,13 +71,9 @@ class LetterDiscovery extends Module {
|
||||
static getCompatibilityScore(content) {
|
||||
const letters = content?.letters || content?.rawContent?.letters;
|
||||
|
||||
// Try to create letters from vocabulary if direct letters not found
|
||||
let lettersData = letters;
|
||||
if (!lettersData && content?.vocabulary) {
|
||||
lettersData = this._createLettersFromVocabulary(content.vocabulary);
|
||||
}
|
||||
|
||||
if (!lettersData || Object.keys(lettersData).length === 0) {
|
||||
// ONLY accept content with explicit letters structure
|
||||
// Do NOT create letters from vocabulary as fallback
|
||||
if (!letters || Object.keys(letters).length === 0) {
|
||||
return {
|
||||
score: 0,
|
||||
reason: 'No letter structure found',
|
||||
@ -86,12 +82,12 @@ class LetterDiscovery extends Module {
|
||||
};
|
||||
}
|
||||
|
||||
const letterCount = letters ? Object.keys(letters).length : 0;
|
||||
const totalWords = letters ? Object.values(letters).reduce((sum, words) => sum + (words?.length || 0), 0) : 0;
|
||||
const letterCount = Object.keys(letters).length;
|
||||
const totalWords = Object.values(letters).reduce((sum, words) => sum + (words?.length || 0), 0);
|
||||
|
||||
if (totalWords === 0) {
|
||||
return {
|
||||
score: 0.2,
|
||||
score: 0,
|
||||
reason: 'Letters found but no words',
|
||||
requirements: ['letters with words'],
|
||||
details: `Found ${letterCount} letters but no associated words`
|
||||
|
||||
@ -1965,20 +1965,33 @@ class MarioEducational extends Module {
|
||||
}
|
||||
|
||||
_updateCatapults() {
|
||||
Catapult.update(this._catapults, this._mario, this._boulders, this._stones, (sound) => soundSystem.play(sound));
|
||||
Catapult.update(this._catapults, this._mario, this._boulders, this._stones, (sound) => soundSystem.play(sound), this._config.canvasHeight);
|
||||
}
|
||||
|
||||
_updateBoulders() {
|
||||
this._boulders = Catapult.updateBoulders(
|
||||
Catapult.updateBoulders(
|
||||
this._boulders, this._mario, this._platforms, this._walls,
|
||||
(boulder, idx, x, y, obj, objIdx, type) => {
|
||||
this._addParticles(x, y, '#808080');
|
||||
if (type === 'mario') this._restartLevel();
|
||||
(boulder, idx, impactX, impactY, obj, objIdx, type) => {
|
||||
this._handleBoulderImpact(boulder, idx, impactX, impactY, obj, objIdx, type);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
_handleBoulderImpact(boulder, boulderIndex, impactX, impactY, hitObject = null, hitObjectIndex = -1, hitType = 'platform') {
|
||||
// Special case: Boulder hit Mario while flying
|
||||
if (hitType === 'mario') {
|
||||
console.log(`💀 Flying boulder hit Mario - restarting level`);
|
||||
this._addParticles(this._mario.x, this._mario.y, '#FF0000'); // Red death particles
|
||||
soundSystem.play('enemy_defeat');
|
||||
|
||||
// Remove the boulder
|
||||
this._boulders.splice(boulderIndex, 1);
|
||||
|
||||
// Restart level
|
||||
this._restartLevel();
|
||||
return;
|
||||
}
|
||||
|
||||
// Set boulder as landed at impact point
|
||||
boulder.x = impactX;
|
||||
boulder.y = impactY;
|
||||
@ -2004,23 +2017,8 @@ class MarioEducational extends Module {
|
||||
}
|
||||
});
|
||||
|
||||
// Reset Mario to level start if he's in explosion radius (50 pixels)
|
||||
const marioDistance = Math.sqrt(
|
||||
Math.pow(this._mario.x - (boulder.x + boulder.width/2), 2) +
|
||||
Math.pow(this._mario.y - (boulder.y + boulder.height/2), 2)
|
||||
);
|
||||
if (marioDistance < 50) {
|
||||
console.log(`💀 Mario killed by boulder explosion! Respawning at level start. Distance: ${marioDistance.toFixed(0)}`);
|
||||
this._addParticles(this._mario.x, this._mario.y, '#FF0000'); // Red death particles
|
||||
soundSystem.play('enemy_defeat');
|
||||
|
||||
// Reset Mario to start position like other enemy deaths
|
||||
const level = this._levelData[this._currentLevelIndex];
|
||||
this._mario.x = level.startX;
|
||||
this._mario.y = level.startY;
|
||||
this._mario.velocityX = 0;
|
||||
this._mario.velocityY = 0;
|
||||
}
|
||||
// Note: Mario is NOT killed by boulder landing explosion
|
||||
// Only flying boulders kill Mario (handled above)
|
||||
|
||||
// Boulder lands only on platforms, ground, stairs - NOT on walls or other boulders (they're destroyed on impact)
|
||||
if (hitObject && (hitType === 'platform' || hitType === 'stair')) {
|
||||
|
||||
@ -1182,7 +1182,7 @@ class RiverRun extends Module {
|
||||
background: linear-gradient(180deg, #87CEEB 0%, #4682B4 50%, #2F4F4F 100%);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
height: 100vh;
|
||||
height: 75vh;
|
||||
cursor: crosshair;
|
||||
}
|
||||
|
||||
|
||||
1446
src/games/SentenceInvaders.js
Normal file
1446
src/games/SentenceInvaders.js
Normal file
File diff suppressed because it is too large
Load Diff
1196
src/games/ThematicQuestions.js
Normal file
1196
src/games/ThematicQuestions.js
Normal file
File diff suppressed because it is too large
Load Diff
@ -211,86 +211,88 @@ class WhackAMole extends Module {
|
||||
style.id = cssId;
|
||||
style.textContent = `
|
||||
.whack-game-wrapper {
|
||||
padding: 20px;
|
||||
max-width: 800px;
|
||||
padding: 10px;
|
||||
max-width: 650px;
|
||||
margin: 0 auto;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
border-radius: 15px;
|
||||
border-radius: 10px;
|
||||
color: white;
|
||||
min-height: 600px;
|
||||
min-height: auto;
|
||||
max-height: 90vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.whack-game-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 25px;
|
||||
padding: 20px;
|
||||
margin-bottom: 10px;
|
||||
padding: 10px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 12px;
|
||||
border-radius: 8px;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.game-stats {
|
||||
display: flex;
|
||||
gap: 30px;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.stat-item {
|
||||
text-align: center;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
padding: 12px 20px;
|
||||
border-radius: 10px;
|
||||
min-width: 80px;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
min-width: 60px;
|
||||
}
|
||||
|
||||
.stat-value {
|
||||
display: block;
|
||||
font-size: 1.8rem;
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
margin-bottom: 5px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
font-size: 0.9rem;
|
||||
font-size: 0.7rem;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.target-display {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
padding: 15px 25px;
|
||||
border-radius: 12px;
|
||||
padding: 8px 15px;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
border: 2px solid rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
.target-label {
|
||||
font-size: 0.9rem;
|
||||
font-size: 0.7rem;
|
||||
opacity: 0.9;
|
||||
margin-bottom: 5px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.target-word {
|
||||
font-size: 1.5rem;
|
||||
font-size: 1rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.game-controls {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.control-btn {
|
||||
padding: 10px 18px;
|
||||
padding: 6px 12px;
|
||||
border: 2px solid rgba(255, 255, 255, 0.3);
|
||||
border-radius: 8px;
|
||||
border-radius: 6px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: white;
|
||||
font-size: 0.9rem;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
@ -316,12 +318,12 @@ class WhackAMole extends Module {
|
||||
.whack-game-board {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 15px;
|
||||
margin: 30px 0;
|
||||
padding: 20px;
|
||||
gap: 10px;
|
||||
margin: 10px 0;
|
||||
padding: 10px;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border-radius: 15px;
|
||||
min-height: 300px;
|
||||
border-radius: 10px;
|
||||
min-height: auto;
|
||||
}
|
||||
|
||||
.whack-hole {
|
||||
@ -346,14 +348,14 @@ class WhackAMole extends Module {
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%) scale(0);
|
||||
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
|
||||
border-radius: 12px;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
padding: 8px;
|
||||
color: white;
|
||||
text-align: center;
|
||||
font-weight: 600;
|
||||
font-size: 1.1rem;
|
||||
font-size: 0.85rem;
|
||||
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
||||
cursor: pointer;
|
||||
max-width: 80%;
|
||||
word-wrap: break-word;
|
||||
@ -370,31 +372,31 @@ class WhackAMole extends Module {
|
||||
|
||||
.whack-mole:hover {
|
||||
transform: translate(-50%, -50%) scale(1.1);
|
||||
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.pronunciation {
|
||||
font-size: 0.8rem;
|
||||
font-size: 0.65rem;
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
font-style: italic;
|
||||
margin-bottom: 5px;
|
||||
margin-bottom: 3px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.feedback-area {
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
padding: 10px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 12px;
|
||||
margin-top: 20px;
|
||||
border-radius: 8px;
|
||||
margin-top: 10px;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.instruction {
|
||||
font-size: 1.1rem;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 500;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
padding: 8px;
|
||||
border-radius: 6px;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
@ -417,7 +419,7 @@ class WhackAMole extends Module {
|
||||
|
||||
.score-popup {
|
||||
position: fixed;
|
||||
font-size: 1.5rem;
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
pointer-events: none;
|
||||
z-index: 1000;
|
||||
@ -444,48 +446,48 @@ class WhackAMole extends Module {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 15px;
|
||||
border-radius: 10px;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.game-over-content {
|
||||
background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
|
||||
color: white;
|
||||
padding: 40px;
|
||||
border-radius: 15px;
|
||||
padding: 20px;
|
||||
border-radius: 10px;
|
||||
text-align: center;
|
||||
max-width: 400px;
|
||||
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
|
||||
max-width: 350px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.game-over-content h2 {
|
||||
margin: 0 0 20px 0;
|
||||
font-size: 2.5rem;
|
||||
margin: 0 0 15px 0;
|
||||
font-size: 1.8rem;
|
||||
}
|
||||
|
||||
.final-stats {
|
||||
margin: 20px 0;
|
||||
padding: 20px;
|
||||
margin: 15px 0;
|
||||
padding: 15px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 10px;
|
||||
border-radius: 8px;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.stat-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin: 10px 0;
|
||||
font-size: 1.1rem;
|
||||
margin: 8px 0;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.game-over-btn {
|
||||
margin: 10px;
|
||||
padding: 12px 25px;
|
||||
margin: 8px;
|
||||
padding: 8px 16px;
|
||||
border: 2px solid white;
|
||||
border-radius: 8px;
|
||||
border-radius: 6px;
|
||||
background: transparent;
|
||||
color: white;
|
||||
font-size: 1rem;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
@ -499,11 +501,11 @@ class WhackAMole extends Module {
|
||||
|
||||
.game-error {
|
||||
text-align: center;
|
||||
padding: 40px;
|
||||
padding: 20px;
|
||||
background: linear-gradient(135deg, #f87171 0%, #ef4444 100%);
|
||||
color: white;
|
||||
border-radius: 15px;
|
||||
height: 100vh;
|
||||
border-radius: 10px;
|
||||
height: 90vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
@ -511,21 +513,21 @@ class WhackAMole extends Module {
|
||||
}
|
||||
|
||||
.game-error h3 {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 20px;
|
||||
font-size: 1.5rem;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.back-btn {
|
||||
padding: 12px 25px;
|
||||
padding: 8px 16px;
|
||||
background: white;
|
||||
color: #ef4444;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
font-size: 1rem;
|
||||
border-radius: 6px;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
margin-top: 20px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.back-btn:hover {
|
||||
@ -569,27 +571,27 @@ class WhackAMole extends Module {
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.whack-game-wrapper {
|
||||
padding: 15px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.whack-game-header {
|
||||
flex-direction: column;
|
||||
gap: 20px;
|
||||
padding: 15px;
|
||||
gap: 8px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.game-stats {
|
||||
gap: 20px;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.whack-game-board {
|
||||
gap: 10px;
|
||||
padding: 15px;
|
||||
gap: 8px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.whack-mole {
|
||||
font-size: 0.9rem;
|
||||
padding: 10px;
|
||||
font-size: 0.75rem;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.game-controls {
|
||||
@ -597,8 +599,8 @@ class WhackAMole extends Module {
|
||||
}
|
||||
|
||||
.control-btn {
|
||||
padding: 8px 15px;
|
||||
font-size: 0.8rem;
|
||||
padding: 5px 10px;
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user