Add Hanyu Jiaocheng content and improve game UX
- Add Hanyu Jiaocheng (Chinese course) book and chapters (3 & 4) - Update TODO with completed game improvements - Remove legacy TODO file - Improve game modules with visual enhancements and bug fixes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
abb09023dd
commit
3a024e6fab
192
Legacy/TODO.md
192
Legacy/TODO.md
@ -1,192 +0,0 @@
|
||||
# TODO List - Class Generator
|
||||
|
||||
## 🔥 EN COURS
|
||||
|
||||
### ✅ NOUVEAU : Système de Compatibilité Content-Game TERMINÉ
|
||||
- [x] **Système complet de vérification de compatibilité implémenté**
|
||||
- Analyse automatique des capacités du contenu
|
||||
- Calculs de compatibilité spécifiques par jeu
|
||||
- Interface visuelle avec badges et séparation des jeux
|
||||
- Modal d'aide avec suggestions d'amélioration
|
||||
- Documentation complète dans `COMPATIBILITY-SYSTEM.md`
|
||||
|
||||
### Problèmes Actuels
|
||||
- [ ] **Corriger le chargement des modules JSON distants dans ContentScanner**
|
||||
- Les fichiers JSON distants sont trouvés mais ne se chargent pas comme modules
|
||||
- Problème avec JsonContentLoader et la transformation en modules
|
||||
- Fichiers concernés : `english-class-demo.json`, `sbs-level-7-8-new.json`
|
||||
|
||||
### Système de listing dynamique
|
||||
- [ ] **Implémenter un système de listing dynamique des fichiers DigitalOcean**
|
||||
- Actuellement bloqué par permissions ListBucket (403 Forbidden)
|
||||
- Les clés actuelles ne permettent que GetObject, pas ListBucket
|
||||
- [ ] **Remplacer la liste hardcodée par une découverte automatique**
|
||||
- Actuellement : liste fixe dans `tryCommonFiles()`
|
||||
- Objectif : scanner dynamiquement tous les fichiers
|
||||
- [ ] **Obtenir des clés avec permissions ListBucket pour le listing S3**
|
||||
|
||||
## 📋 À FAIRE - URGENT
|
||||
|
||||
### Core Navigation System
|
||||
- [x] ~~Create index.html with 3-level navigation~~ ✅ FAIT
|
||||
- [x] ~~Implement URL routing with params~~ ✅ FAIT (`?page=games&game=whack&content=sbs8`)
|
||||
- [x] ~~Build game-selector.html with clickable cards~~ ✅ FAIT (intégré dans index.html)
|
||||
- [x] ~~Build level-selector.html with dynamic content loading~~ ✅ FAIT
|
||||
- [x] ~~Create game.html generic page with dynamic module loading~~ ✅ FAIT
|
||||
|
||||
### Game Modules
|
||||
- [x] ~~Refactor existing whack-a-mole.js into proper module format~~ ✅ FAIT
|
||||
- [x] ~~Refactor existing fill-the-blank.js into proper module format~~ ✅ FAIT
|
||||
- [x] ~~Implement game loader system~~ ✅ FAIT (`js/core/game-loader.js`)
|
||||
- [x] ~~Create base GameEngine class for inheritance~~ ✅ FAIT (pattern établi)
|
||||
|
||||
### Content System
|
||||
- [x] ~~Convert sbs-level-8.js to new unified format~~ ✅ FAIT (sbs-level-7-8-new.json)
|
||||
- [x] ~~Implement content loader system~~ ✅ FAIT (content-scanner.js, json-content-loader.js)
|
||||
- [x] ~~Create content validation functions~~ ✅ FAIT
|
||||
- [x] ~~Add error handling for missing content~~ ✅ FAIT
|
||||
|
||||
### Jeux Existants
|
||||
- [x] ~~whack-a-mole.js~~ ✅ FAIT
|
||||
- [x] ~~whack-a-mole-hard.js~~ ✅ FAIT
|
||||
- [x] ~~memory-match.js~~ ✅ FAIT
|
||||
- [x] ~~quiz-game.js~~ ✅ FAIT
|
||||
- [x] ~~fill-the-blank.js~~ ✅ FAIT
|
||||
- [x] ~~text-reader.js~~ ✅ FAIT
|
||||
- [x] ~~adventure-reader.js~~ ✅ FAIT
|
||||
|
||||
## 📚 CONTENT EXPANSION
|
||||
|
||||
### Contenu DigitalOcean
|
||||
- [ ] **Ajouter plus de fichiers JSON sur DigitalOcean**
|
||||
- Actuellement : `english-class-demo.json`, `sbs-level-7-8-new.json`
|
||||
- À ajouter : animals.json, colors.json, family.json, etc.
|
||||
|
||||
### Lesson Introduction Module
|
||||
- [ ] Create lesson-intro.js for vocabulary presentation
|
||||
- [ ] Add context presentation before games
|
||||
- [ ] Implement guided repetition system
|
||||
- [ ] Add audio playback for pronunciation
|
||||
|
||||
## 🔧 TECHNICAL IMPROVEMENTS
|
||||
|
||||
### Core System (DÉJÀ FAIT)
|
||||
- [x] ~~navigation.js - handle URL routing and back buttons~~ ✅ FAIT
|
||||
- [x] ~~utils.js - shared utility functions~~ ✅ FAIT
|
||||
- [x] ~~audio-manager.js~~ ✅ Intégré dans les jeux
|
||||
- [x] ~~progress-tracker.js~~ ✅ Score tracking implémenté
|
||||
|
||||
### Performance & UX
|
||||
- [x] ~~Lazy loading for game modules~~ ✅ FAIT (GameLoader)
|
||||
- [x] ~~Add loading states and spinners~~ ✅ FAIT
|
||||
- [x] ~~Implement keyboard shortcuts (ESC = back)~~ ✅ FAIT
|
||||
|
||||
### Réseau et Cloud
|
||||
- [x] ~~Configuration DigitalOcean Spaces~~ ✅ FAIT
|
||||
- [x] ~~Proxy HTTP sur port 8083~~ ✅ FAIT
|
||||
- [x] ~~Authentification AWS Signature V4~~ ✅ FAIT
|
||||
- [x] ~~Support HEAD et GET dans le proxy~~ ✅ FAIT
|
||||
- [x] ~~WebSocket logger sur port 8082~~ ✅ FAIT
|
||||
|
||||
## 🎯 ARCHITECTURE ACTUELLE
|
||||
|
||||
### Structure Implémentée ✅
|
||||
```
|
||||
├── index.html ✅
|
||||
├── css/
|
||||
│ ├── styles.css ✅
|
||||
│ └── components/ ✅
|
||||
├── js/
|
||||
│ ├── core/
|
||||
│ │ ├── navigation.js ✅
|
||||
│ │ ├── game-loader.js ✅
|
||||
│ │ ├── content-scanner.js ✅
|
||||
│ │ ├── content-engine.js ✅
|
||||
│ │ ├── json-content-loader.js ✅
|
||||
│ │ ├── env-config.js ✅
|
||||
│ │ └── websocket-logger.js ✅
|
||||
│ ├── games/
|
||||
│ │ ├── whack-a-mole.js ✅
|
||||
│ │ ├── whack-a-mole-hard.js ✅
|
||||
│ │ ├── memory-match.js ✅
|
||||
│ │ ├── quiz-game.js ✅
|
||||
│ │ ├── fill-the-blank.js ✅
|
||||
│ │ ├── text-reader.js ✅
|
||||
│ │ └── adventure-reader.js ✅
|
||||
│ └── content/
|
||||
│ ├── sbs-level-7-8-new.js ✅
|
||||
│ └── [fichiers JSON distants via proxy]
|
||||
├── export_logger/
|
||||
│ ├── websocket-server.js ✅
|
||||
│ └── logs-viewer.html ✅
|
||||
└── Start_Class_Generator.bat ✅
|
||||
```
|
||||
|
||||
## 🌟 FUTURES AMÉLIORATIONS
|
||||
|
||||
### Nouveaux Types de Jeux
|
||||
- [ ] simon-says.js - jeu "Touch the X" digital
|
||||
- [ ] speed-categories.js - catégorisation rapide
|
||||
- [ ] true-false.js - vrai/faux avec images
|
||||
- [ ] sound-match.js - correspondance audio-image
|
||||
- [ ] catch-words.js - mots volants à attraper
|
||||
- [ ] drag-drop.js - construction de phrases
|
||||
- [ ] story-builder.js - construction narrative
|
||||
|
||||
### Système de Contenu
|
||||
- [ ] Schémas de validation JSON
|
||||
- [ ] Générateurs de contenu dynamique
|
||||
- [ ] Import/export de contenu
|
||||
- [ ] Support multi-langue UI
|
||||
|
||||
### Extensions Système
|
||||
- [ ] Architecture de plugins pour jeux tiers
|
||||
- [ ] API pour sources de contenu externes
|
||||
- [ ] Système de cache offline avancé
|
||||
- [ ] PWA (Progressive Web App)
|
||||
|
||||
## 🚀 VERSION CHINOISE (FUTUR)
|
||||
|
||||
### Adaptations Architecture
|
||||
- [ ] Format de contenu étendu pour le chinois
|
||||
- [ ] Support des tons dans le système audio
|
||||
- [ ] Ordre des traits des caractères
|
||||
- [ ] Système d'affichage pinyin
|
||||
|
||||
### Jeux Spécifiques Chinois
|
||||
- [ ] stroke-order.js - écriture de caractères
|
||||
- [ ] tone-practice.js - reconnaissance des tons
|
||||
- [ ] radical-builder.js - composition de caractères
|
||||
- [ ] pinyin-typing.js - pratique de romanisation
|
||||
|
||||
## 🤖 INTÉGRATION IA (FUTUR)
|
||||
|
||||
### Points d'Intégration API
|
||||
- [ ] content-generator.js - création de contenu IA
|
||||
- [ ] response-validator.js - vérification de réponses IA
|
||||
- [ ] difficulty-adapter.js - ajustement de difficulté IA
|
||||
- [ ] feedback-generator.js - feedback personnalisé IA
|
||||
|
||||
### Collection de Données
|
||||
- [ ] Logging des interactions utilisateur
|
||||
- [ ] Collection de métriques de performance
|
||||
- [ ] Tracking des patterns d'erreur
|
||||
- [ ] Structure de données de progression
|
||||
|
||||
## 📝 Notes Importantes
|
||||
|
||||
### Configuration Actuelle
|
||||
- **Proxy** : `http://localhost:8083/do-proxy/`
|
||||
- **WebSocket** : `ws://localhost:8082`
|
||||
- **App** : `http://localhost:8080`
|
||||
|
||||
### Fichiers Confirmés sur DigitalOcean
|
||||
- `english-class-demo.json` (12,425 caractères)
|
||||
- `sbs-level-7-8-new.json` (9,382 caractères)
|
||||
|
||||
### Clés DigitalOcean
|
||||
- Access Key : `DO8018LC8QF7CFBF7E2K`
|
||||
- Limitation : GetObject seulement, pas ListBucket
|
||||
|
||||
### Problème Principal Restant
|
||||
Les fichiers JSON distants sont détectés mais ne se transforment pas en modules JavaScript utilisables par l'application.
|
||||
11
TODO.md
11
TODO.md
@ -5,9 +5,10 @@
|
||||
- [ ] **Whack-a-Mole**: Adjust size to be more flexible
|
||||
- [ ] **Whack-a-Mole**: Hard mode is too difficult
|
||||
- [ ] **Whack-a-Mole**: Add speed meter
|
||||
- [ ] **Adventure Reader**: Add restart button at the top
|
||||
- [ ] **Riverrun**: Players don't understand the game mechanics
|
||||
- [ ] **Mario**: Handle touchscreen controls
|
||||
- [x] **Adventure Reader**: Add restart button at the top (DONE)
|
||||
- [x] **Riverrun**: Players don't understand the game mechanics (DONE)
|
||||
- [x] **Mario**: Handle touchscreen controls (DONE - added touch protections: no zoom, no right-click, no scroll)
|
||||
- [ ] **Sentence Invaders**: Make harder with time
|
||||
- [ ] **Wizard**: Crashes on WeChat
|
||||
- [ ] **Wizard**: Crashes with WTE (Word Translation Exercise)
|
||||
- [x] **Wizard**: Crashes on WeChat (DONE)
|
||||
- [x] **Wizard**: Crashes with WTE (Word Translation Exercise) (DONE)
|
||||
- [x] **Wizard**: Prevent spam clicking on Cast Spell button (DONE - button now disables on click)
|
||||
|
||||
107
content/books/hanyu-book.json
Normal file
107
content/books/hanyu-book.json
Normal file
@ -0,0 +1,107 @@
|
||||
{
|
||||
"id": "hanyu-jiaocheng",
|
||||
"name": "汉语教程 (Hànyǔ Jiàochéng) - Comprehensive Chinese Course",
|
||||
"description": "Complete Hanyu Jiaocheng curriculum for intermediate to advanced Chinese learners, focusing on comprehensive language skills development",
|
||||
"difficulty": "intermediate-advanced",
|
||||
"language": "zh-CN",
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2025-10-23",
|
||||
"updated": "2025-10-23",
|
||||
"source": "Hanyu Jiaocheng Textbook - Jiaotong University",
|
||||
"target_level": "intermediate-advanced",
|
||||
"total_estimated_hours": 200,
|
||||
"prerequisites": ["basic-chinese", "hsk-3", "hsk-4"],
|
||||
"learning_objectives": [
|
||||
"Master comprehensive Chinese vocabulary for academic and daily contexts",
|
||||
"Develop advanced reading comprehension skills",
|
||||
"Understand complex grammatical patterns",
|
||||
"Practice authentic Chinese communication",
|
||||
"Build cultural and contextual understanding"
|
||||
],
|
||||
"content_tags": ["chinese", "hanyu-jiaocheng", "comprehensive", "intermediate", "advanced"],
|
||||
"total_chapters": 20,
|
||||
"available_chapters": [
|
||||
"hanyu-chapter1",
|
||||
"hanyu-chapter3",
|
||||
"hanyu-chapter4",
|
||||
"hanyu-chapter5"
|
||||
],
|
||||
"completion_criteria": {
|
||||
"overall_progress": 85,
|
||||
"chapters_completed": 20,
|
||||
"vocabulary_mastery": 90,
|
||||
"comprehension_score": 80
|
||||
}
|
||||
},
|
||||
"chapters": [
|
||||
{
|
||||
"id": "hanyu-chapter1",
|
||||
"chapter_number": "1",
|
||||
"name": "Chapter 1",
|
||||
"description": "First chapter of Hanyu Jiaocheng",
|
||||
"estimated_hours": 10,
|
||||
"difficulty": "intermediate",
|
||||
"prerequisites": ["hsk-3"],
|
||||
"learning_objectives": [
|
||||
"Master chapter vocabulary",
|
||||
"Understand key grammar patterns",
|
||||
"Practice reading comprehension"
|
||||
],
|
||||
"vocabulary_count": 0,
|
||||
"phrases_count": 0,
|
||||
"texts_count": 0,
|
||||
"exercises_count": 0
|
||||
},
|
||||
{
|
||||
"id": "hanyu-chapter3",
|
||||
"chapter_number": "3",
|
||||
"name": "北京的四季 (Běijīng de Sìjì) - Four Seasons in Beijing",
|
||||
"description": "Exploration of Beijing's four seasons, weather patterns, and seasonal activities",
|
||||
"estimated_hours": 12,
|
||||
"difficulty": "intermediate",
|
||||
"prerequisites": ["hanyu-chapter1", "hanyu-chapter2"],
|
||||
"learning_objectives": [
|
||||
"Master 40+ vocabulary terms related to seasons and weather",
|
||||
"Understand directional complements 上/下",
|
||||
"Learn the pattern 拿...来说",
|
||||
"Practice using 也许, 多么"
|
||||
],
|
||||
"vocabulary_count": 40,
|
||||
"phrases_count": 5,
|
||||
"texts_count": 2,
|
||||
"exercises_count": 20
|
||||
},
|
||||
{
|
||||
"id": "hanyu-chapter4",
|
||||
"chapter_number": "4",
|
||||
"name": "理想 (Lǐxiǎng) - Ideal",
|
||||
"description": "Stories about pursuing dreams, overcoming difficulties, and persevering toward one's ideals",
|
||||
"estimated_hours": 12,
|
||||
"difficulty": "intermediate",
|
||||
"prerequisites": ["hanyu-chapter1", "hanyu-chapter2", "hanyu-chapter3"],
|
||||
"learning_objectives": [
|
||||
"Master 40+ vocabulary terms related to ideals and life choices",
|
||||
"Understand patterns: 一点儿+也/都+不, 当然, 不过, 简直",
|
||||
"Learn adverbs: 从, 偷偷儿",
|
||||
"Practice 动词+着+动词+着 structure"
|
||||
],
|
||||
"vocabulary_count": 40,
|
||||
"phrases_count": 7,
|
||||
"texts_count": 3,
|
||||
"exercises_count": 20
|
||||
},
|
||||
{
|
||||
"id": "hanyu-chapter5",
|
||||
"chapter_number": "5",
|
||||
"name": "Chapter 5",
|
||||
"description": "Fifth chapter of Hanyu Jiaocheng",
|
||||
"estimated_hours": 10,
|
||||
"difficulty": "intermediate",
|
||||
"vocabulary_count": 0,
|
||||
"phrases_count": 0,
|
||||
"texts_count": 0,
|
||||
"exercises_count": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
866
content/chapters/hanyu-chapter3.json
Normal file
866
content/chapters/hanyu-chapter3.json
Normal file
@ -0,0 +1,866 @@
|
||||
{
|
||||
"id": "hanyu-chapter3",
|
||||
"book_id": "hanyu-jiaocheng",
|
||||
"name": "北京的四季 (Běijīng de Sìjì) - Four Seasons in Beijing",
|
||||
"description": "Exploration of Beijing's four seasons, weather patterns, and seasonal activities. Learn about Chinese perspectives on nature and seasonal changes.",
|
||||
"difficulty": "intermediate",
|
||||
"language": "zh-CN",
|
||||
"chapter_number": "3",
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2025-10-23",
|
||||
"updated": "2025-10-23",
|
||||
"source": "Hanyu Jiaocheng - Jiaotong University",
|
||||
"target_level": "intermediate",
|
||||
"estimated_hours": 12,
|
||||
"prerequisites": ["hanyu-chapter1", "hanyu-chapter2"],
|
||||
"learning_objectives": [
|
||||
"Master 90+ vocabulary terms related to seasons and weather",
|
||||
"Understand directional complements 上/下",
|
||||
"Learn the pattern 拿...来说 (take as example)",
|
||||
"Practice using 也许, 多么, and other adverbs",
|
||||
"Develop reading comprehension about Chinese culture and seasons"
|
||||
],
|
||||
"content_tags": ["seasons", "weather", "beijing", "culture", "nature"],
|
||||
"completion_criteria": {
|
||||
"vocabulary_mastery": 85,
|
||||
"comprehension_score": 80,
|
||||
"exercises_completed": 20
|
||||
}
|
||||
},
|
||||
"vocabulary": {
|
||||
"首都": {
|
||||
"pronunciation": "shǒudū",
|
||||
"type": "noun",
|
||||
"user_language": "capital city",
|
||||
"examples": ["首都北京", "中国的首都"]
|
||||
},
|
||||
"季节": {
|
||||
"pronunciation": "jìjié",
|
||||
"type": "noun",
|
||||
"user_language": "season",
|
||||
"examples": ["四个季节", "春季、夏季、秋季、冬季"]
|
||||
},
|
||||
"部分": {
|
||||
"pronunciation": "bùfen",
|
||||
"type": "noun",
|
||||
"user_language": "part, section",
|
||||
"examples": ["中国的大部分地区", "一部分人", "部分学校"]
|
||||
},
|
||||
"地区": {
|
||||
"pronunciation": "dìqū",
|
||||
"type": "noun",
|
||||
"user_language": "region, area",
|
||||
"examples": ["北京地区", "这个地区很美"]
|
||||
},
|
||||
"拿": {
|
||||
"pronunciation": "ná",
|
||||
"type": "preposition",
|
||||
"user_language": "used to introduce the object (to take as example)",
|
||||
"examples": ["就拿首都北京来说吧", "拿人们的生活水平来说"],
|
||||
"notes": "Used in pattern: 拿 + noun + 来 + verb (说/看/讲/比较)"
|
||||
},
|
||||
"脱": {
|
||||
"pronunciation": "tuō",
|
||||
"type": "verb",
|
||||
"user_language": "to take off, to remove (clothes)",
|
||||
"examples": ["脱下冬衣", "脱下皮鞋"]
|
||||
},
|
||||
"冬衣": {
|
||||
"pronunciation": "dōngyī",
|
||||
"type": "noun",
|
||||
"user_language": "winter clothes",
|
||||
"examples": ["人们脱下冬衣"]
|
||||
},
|
||||
"春装": {
|
||||
"pronunciation": "chūnzhuāng",
|
||||
"type": "noun",
|
||||
"user_language": "spring clothes",
|
||||
"examples": ["换上春装"]
|
||||
},
|
||||
"姑娘": {
|
||||
"pronunciation": "gūniang",
|
||||
"type": "noun",
|
||||
"user_language": "girl, young woman",
|
||||
"examples": ["姑娘和小伙子们", "美丽的姑娘"]
|
||||
},
|
||||
"湖": {
|
||||
"pronunciation": "hú",
|
||||
"type": "noun",
|
||||
"user_language": "lake",
|
||||
"examples": ["在湖上划船", "西湖"]
|
||||
},
|
||||
"划船": {
|
||||
"pronunciation": "huá chuán",
|
||||
"type": "verb phrase",
|
||||
"user_language": "to row a boat",
|
||||
"examples": ["在湖上划船", "我们去划船吧"]
|
||||
},
|
||||
"划": {
|
||||
"pronunciation": "huá",
|
||||
"type": "verb",
|
||||
"user_language": "to row, to paddle",
|
||||
"examples": ["划船", "划桨"]
|
||||
},
|
||||
"船": {
|
||||
"pronunciation": "chuán",
|
||||
"type": "noun",
|
||||
"user_language": "boat, ship",
|
||||
"examples": ["划船", "坐船"]
|
||||
},
|
||||
"充满": {
|
||||
"pronunciation": "chōngmǎn",
|
||||
"type": "verb",
|
||||
"user_language": "to be full of, to be filled with",
|
||||
"examples": ["充满了歌声和笑声", "充满信心", "充满希望"]
|
||||
},
|
||||
"游人": {
|
||||
"pronunciation": "yóurén",
|
||||
"type": "noun",
|
||||
"user_language": "visitor, tourist, sightseer",
|
||||
"examples": ["来自世界各地的游人", "游人很多"]
|
||||
},
|
||||
"显得": {
|
||||
"pronunciation": "xiǎnde",
|
||||
"type": "verb",
|
||||
"user_language": "to look, to seem, to appear",
|
||||
"examples": ["显得轻松而愉快", "显得很高兴", "显得多么年轻"]
|
||||
},
|
||||
"轻松": {
|
||||
"pronunciation": "qīngsōng",
|
||||
"type": "adjective",
|
||||
"user_language": "relaxed, not feeling nervous",
|
||||
"examples": ["显得轻松而愉快", "轻松的心情"]
|
||||
},
|
||||
"火锅儿": {
|
||||
"pronunciation": "huǒguōr",
|
||||
"type": "noun",
|
||||
"user_language": "hotpot, chafing dish",
|
||||
"examples": ["吃火锅儿", "围坐在火锅儿旁边"]
|
||||
},
|
||||
"围": {
|
||||
"pronunciation": "wéi",
|
||||
"type": "verb",
|
||||
"user_language": "to enclose, to surround",
|
||||
"examples": ["围坐在火锅儿旁边", "围着桌子坐"]
|
||||
},
|
||||
"向往": {
|
||||
"pronunciation": "xiàngwǎng",
|
||||
"type": "verb",
|
||||
"user_language": "to yearn for, to look forward to",
|
||||
"examples": ["让人羡慕和向往", "向往北京", "向往幸福生活"]
|
||||
},
|
||||
"堆雪人儿": {
|
||||
"pronunciation": "duī xuěrénr",
|
||||
"type": "verb phrase",
|
||||
"user_language": "to build a snowman",
|
||||
"examples": ["孩子们堆雪人儿"]
|
||||
},
|
||||
"堆": {
|
||||
"pronunciation": "duī",
|
||||
"type": "verb",
|
||||
"user_language": "to pile up, to stack",
|
||||
"examples": ["堆雪人儿", "堆书"]
|
||||
},
|
||||
"打雪仗": {
|
||||
"pronunciation": "dǎ xuězhàng",
|
||||
"type": "verb phrase",
|
||||
"user_language": "to have a snowball fight",
|
||||
"examples": ["打雪仗", "孩子们在打雪仗"]
|
||||
},
|
||||
"打": {
|
||||
"pronunciation": "dǎ",
|
||||
"type": "verb",
|
||||
"user_language": "to fight, to beat",
|
||||
"examples": ["打雪仗", "打架"]
|
||||
},
|
||||
"冻": {
|
||||
"pronunciation": "dòng",
|
||||
"type": "verb",
|
||||
"user_language": "to feel very cold, to freeze",
|
||||
"examples": ["小脸和小手冻得红红的", "我冻得不行了"]
|
||||
},
|
||||
"瑞雪兆丰年": {
|
||||
"pronunciation": "ruìxuě zhào fēngnián",
|
||||
"type": "idiom",
|
||||
"user_language": "a timely snow promises a good harvest",
|
||||
"examples": ["北京人说:瑞雪兆丰年"],
|
||||
"notes": "Traditional Chinese proverb"
|
||||
},
|
||||
"场": {
|
||||
"pronunciation": "cháng",
|
||||
"type": "measure word",
|
||||
"user_language": "a measure word for events, games, shows",
|
||||
"examples": ["下几场大雪", "一场电影"]
|
||||
},
|
||||
"收成": {
|
||||
"pronunciation": "shōucheng",
|
||||
"type": "noun",
|
||||
"user_language": "harvest, crop",
|
||||
"examples": ["有好收成", "今年的收成不错"]
|
||||
},
|
||||
"数": {
|
||||
"pronunciation": "shǔ",
|
||||
"type": "verb",
|
||||
"user_language": "to be reckoned as exceptionally (good or bad)",
|
||||
"examples": ["要数秋天了", "数他最高", "数得上"]
|
||||
},
|
||||
"大街": {
|
||||
"pronunciation": "dàjiē",
|
||||
"type": "noun",
|
||||
"user_language": "main street, avenue",
|
||||
"examples": ["大街上到处是鲜花", "走在大街上"]
|
||||
},
|
||||
"鲜花": {
|
||||
"pronunciation": "xiānhuā",
|
||||
"type": "noun",
|
||||
"user_language": "(fresh) flower",
|
||||
"examples": ["到处是鲜花", "买鲜花"]
|
||||
},
|
||||
"瓜": {
|
||||
"pronunciation": "guā",
|
||||
"type": "noun",
|
||||
"user_language": "melon, gourd",
|
||||
"examples": ["瓜果", "西瓜"]
|
||||
},
|
||||
"果": {
|
||||
"pronunciation": "guǒ",
|
||||
"type": "noun",
|
||||
"user_language": "fruit",
|
||||
"examples": ["瓜果", "水果"]
|
||||
},
|
||||
"每": {
|
||||
"pronunciation": "měi",
|
||||
"type": "adverb",
|
||||
"user_language": "every, each",
|
||||
"examples": ["每到周末", "每天", "每个人"]
|
||||
},
|
||||
"郊外": {
|
||||
"pronunciation": "jiāowài",
|
||||
"type": "noun",
|
||||
"user_language": "outskirts, countryside around a city",
|
||||
"examples": ["到郊外去玩儿", "郊外风景很美"]
|
||||
},
|
||||
"美丽": {
|
||||
"pronunciation": "měilì",
|
||||
"type": "adjective",
|
||||
"user_language": "beautiful",
|
||||
"examples": ["最美丽的景色", "美丽的城市", "美丽的姑娘"]
|
||||
},
|
||||
"美": {
|
||||
"pronunciation": "měi",
|
||||
"type": "adjective",
|
||||
"user_language": "beautiful",
|
||||
"examples": ["最美的风光", "很美"]
|
||||
},
|
||||
"景色": {
|
||||
"pronunciation": "jǐngsè",
|
||||
"type": "noun",
|
||||
"user_language": "scenery, view, scene",
|
||||
"examples": ["最美丽的景色", "美丽的景色", "山上的景色"]
|
||||
},
|
||||
"如今": {
|
||||
"pronunciation": "rújīn",
|
||||
"type": "noun",
|
||||
"user_language": "now, today, at present",
|
||||
"examples": ["这个古老的国家如今显得多么年轻", "如今的生活"]
|
||||
},
|
||||
"多么": {
|
||||
"pronunciation": "duōme",
|
||||
"type": "adverb",
|
||||
"user_language": "what, how, to a great extent",
|
||||
"examples": ["显得多么年轻", "多么热情", "多么美好"],
|
||||
"notes": "Used in exclamatory sentences"
|
||||
},
|
||||
"勤劳": {
|
||||
"pronunciation": "qínláo",
|
||||
"type": "adjective",
|
||||
"user_language": "industrious, hard-working",
|
||||
"examples": ["勤劳善良的中国人", "勤劳的人民"]
|
||||
},
|
||||
"善良": {
|
||||
"pronunciation": "shànliáng",
|
||||
"type": "adjective",
|
||||
"user_language": "good and honest, kind-hearted",
|
||||
"examples": ["勤劳善良", "善良的人"]
|
||||
},
|
||||
"热爱": {
|
||||
"pronunciation": "rè'ài",
|
||||
"type": "verb",
|
||||
"user_language": "to love deeply",
|
||||
"examples": ["热爱和平", "热爱工作", "热爱祖国"],
|
||||
"notes": "More formal than 爱, used for country, peace, people"
|
||||
},
|
||||
"友好": {
|
||||
"pronunciation": "yǒuhǎo",
|
||||
"type": "adjective",
|
||||
"user_language": "friendly",
|
||||
"examples": ["热情友好的人们", "友好相处"]
|
||||
},
|
||||
"亲爱": {
|
||||
"pronunciation": "qīn'ài",
|
||||
"type": "adjective",
|
||||
"user_language": "dear",
|
||||
"examples": ["亲爱的朋友", "亲爱的同学们"]
|
||||
},
|
||||
"愿": {
|
||||
"pronunciation": "yuàn",
|
||||
"type": "verb",
|
||||
"user_language": "to hope, to wish, to like",
|
||||
"examples": ["愿你们生活得平安快乐", "我愿意"]
|
||||
},
|
||||
"平安": {
|
||||
"pronunciation": "píng'ān",
|
||||
"type": "adjective",
|
||||
"user_language": "safe and sound",
|
||||
"examples": ["生活得平安快乐", "一路平安"]
|
||||
},
|
||||
"树": {
|
||||
"pronunciation": "shù",
|
||||
"type": "noun",
|
||||
"user_language": "tree",
|
||||
"examples": ["树绿了", "种树", "大树"]
|
||||
},
|
||||
"绿": {
|
||||
"pronunciation": "lǜ",
|
||||
"type": "adjective",
|
||||
"user_language": "green",
|
||||
"examples": ["树绿了", "很绿", "绿色"]
|
||||
},
|
||||
"花儿": {
|
||||
"pronunciation": "huār",
|
||||
"type": "noun",
|
||||
"user_language": "flower",
|
||||
"examples": ["花儿开了", "在花儿前照相"]
|
||||
},
|
||||
"开": {
|
||||
"pronunciation": "kāi",
|
||||
"type": "verb",
|
||||
"user_language": "to open, to bloom; to turn on",
|
||||
"examples": ["花儿开了", "开门", "暖气一开"]
|
||||
},
|
||||
"天气": {
|
||||
"pronunciation": "tiānqì",
|
||||
"type": "noun",
|
||||
"user_language": "weather",
|
||||
"examples": ["天气暖和了", "天气热了", "天气不冷也不热"]
|
||||
},
|
||||
"暖和": {
|
||||
"pronunciation": "nuǎnhuo",
|
||||
"type": "adjective",
|
||||
"user_language": "warm (pleasantly)",
|
||||
"examples": ["天气暖和了", "屋子里很暖和", "穿着很暖和"]
|
||||
},
|
||||
"打扮": {
|
||||
"pronunciation": "dǎban",
|
||||
"type": "verb",
|
||||
"user_language": "to dress up, to make oneself up",
|
||||
"examples": ["打扮得漂漂亮亮的", "好好打扮一下"]
|
||||
},
|
||||
"照相": {
|
||||
"pronunciation": "zhàoxiàng",
|
||||
"type": "verb",
|
||||
"user_language": "to take a photo",
|
||||
"examples": ["在花儿前照相", "去外边照相"]
|
||||
},
|
||||
"歌声": {
|
||||
"pronunciation": "gēshēng",
|
||||
"type": "noun",
|
||||
"user_language": "singing voice, sound of singing",
|
||||
"examples": ["年轻人的歌声和笑声", "听到歌声"]
|
||||
},
|
||||
"笑声": {
|
||||
"pronunciation": "xiàoshēng",
|
||||
"type": "noun",
|
||||
"user_language": "laughter, sound of laughing",
|
||||
"examples": ["歌声和笑声", "充满了笑声"]
|
||||
},
|
||||
"游泳": {
|
||||
"pronunciation": "yóuyǒng",
|
||||
"type": "verb",
|
||||
"user_language": "to swim",
|
||||
"examples": ["去游泳", "喜欢游泳"]
|
||||
},
|
||||
"散步": {
|
||||
"pronunciation": "sànbù",
|
||||
"type": "verb",
|
||||
"user_language": "to take a walk, to stroll",
|
||||
"examples": ["到外边散步", "散步的人", "吃完饭去散步"]
|
||||
},
|
||||
"聊天儿": {
|
||||
"pronunciation": "liáo tiānr",
|
||||
"type": "verb",
|
||||
"user_language": "to chat",
|
||||
"examples": ["散步、聊天儿", "一边走一边聊"]
|
||||
},
|
||||
"马路": {
|
||||
"pronunciation": "mǎlù",
|
||||
"type": "noun",
|
||||
"user_language": "street, road",
|
||||
"examples": ["马路边", "过马路"]
|
||||
},
|
||||
"愉快": {
|
||||
"pronunciation": "yúkuài",
|
||||
"type": "adjective",
|
||||
"user_language": "happy, joyful, cheerful",
|
||||
"examples": ["轻松而愉快", "很愉快"]
|
||||
},
|
||||
"暖气": {
|
||||
"pronunciation": "nuǎnqì",
|
||||
"type": "noun",
|
||||
"user_language": "heating",
|
||||
"examples": ["暖气一开", "开暖气"]
|
||||
},
|
||||
"屋子": {
|
||||
"pronunciation": "wūzi",
|
||||
"type": "noun",
|
||||
"user_language": "room, house",
|
||||
"examples": ["屋子里很暖和", "进屋子"]
|
||||
},
|
||||
"情景": {
|
||||
"pronunciation": "qíngjǐng",
|
||||
"type": "noun",
|
||||
"user_language": "scene, sight, circumstance",
|
||||
"examples": ["这情景让人羡慕", "美好的情景"]
|
||||
},
|
||||
"羡慕": {
|
||||
"pronunciation": "xiànmù",
|
||||
"type": "verb",
|
||||
"user_language": "to envy, to admire",
|
||||
"examples": ["让人羡慕和向往", "我真羡慕他"]
|
||||
},
|
||||
"雪": {
|
||||
"pronunciation": "xuě",
|
||||
"type": "noun",
|
||||
"user_language": "snow",
|
||||
"examples": ["下雪", "大雪", "雪景"]
|
||||
},
|
||||
"下雪": {
|
||||
"pronunciation": "xià xuě",
|
||||
"type": "verb phrase",
|
||||
"user_language": "to snow",
|
||||
"examples": ["不常下雪", "下了雪", "下几场大雪"]
|
||||
},
|
||||
"要是": {
|
||||
"pronunciation": "yàoshi",
|
||||
"type": "conjunction",
|
||||
"user_language": "if",
|
||||
"examples": ["要是下了雪", "要是你能去看看"]
|
||||
},
|
||||
"过节": {
|
||||
"pronunciation": "guò jié",
|
||||
"type": "verb phrase",
|
||||
"user_language": "to celebrate a festival",
|
||||
"examples": ["像过节一样高兴", "过春节"]
|
||||
},
|
||||
"风光": {
|
||||
"pronunciation": "fēngguāng",
|
||||
"type": "noun",
|
||||
"user_language": "scenery, landscape",
|
||||
"examples": ["最美的风光", "欣赏风光"]
|
||||
},
|
||||
"雪景": {
|
||||
"pronunciation": "xuějǐng",
|
||||
"type": "noun",
|
||||
"user_language": "snowy scenery",
|
||||
"examples": ["最美的风光就是雪景", "看雪景"]
|
||||
},
|
||||
"相机": {
|
||||
"pronunciation": "xiàngjī",
|
||||
"type": "noun",
|
||||
"user_language": "camera",
|
||||
"examples": ["带上相机", "用相机照相"]
|
||||
},
|
||||
"雪地": {
|
||||
"pronunciation": "xuědì",
|
||||
"type": "noun",
|
||||
"user_language": "snowy ground",
|
||||
"examples": ["在雪地上跑", "雪地里"]
|
||||
},
|
||||
"脸": {
|
||||
"pronunciation": "liǎn",
|
||||
"type": "noun",
|
||||
"user_language": "face",
|
||||
"examples": ["小脸冻得红红的", "洗脸"]
|
||||
},
|
||||
"手": {
|
||||
"pronunciation": "shǒu",
|
||||
"type": "noun",
|
||||
"user_language": "hand",
|
||||
"examples": ["小手冻得红红的", "洗手"]
|
||||
},
|
||||
"红": {
|
||||
"pronunciation": "hóng",
|
||||
"type": "adjective",
|
||||
"user_language": "red",
|
||||
"examples": ["冻得红红的", "红叶", "红色"]
|
||||
},
|
||||
"刮风": {
|
||||
"pronunciation": "guā fēng",
|
||||
"type": "verb phrase",
|
||||
"user_language": "to be windy",
|
||||
"examples": ["很少刮风", "刮大风"]
|
||||
},
|
||||
"周末": {
|
||||
"pronunciation": "zhōumò",
|
||||
"type": "noun",
|
||||
"user_language": "weekend",
|
||||
"examples": ["每到周末", "这个周末"]
|
||||
},
|
||||
"满": {
|
||||
"pronunciation": "mǎn",
|
||||
"type": "adjective",
|
||||
"user_language": "full",
|
||||
"examples": ["满山的红叶", "满街都是"]
|
||||
},
|
||||
"山": {
|
||||
"pronunciation": "shān",
|
||||
"type": "noun",
|
||||
"user_language": "mountain, hill",
|
||||
"examples": ["满山的红叶", "爬山"]
|
||||
},
|
||||
"红叶": {
|
||||
"pronunciation": "hóngyè",
|
||||
"type": "noun",
|
||||
"user_language": "red autumn leaves",
|
||||
"examples": ["满山的红叶", "看红叶"]
|
||||
},
|
||||
"爬": {
|
||||
"pronunciation": "pá",
|
||||
"type": "verb",
|
||||
"user_language": "to climb",
|
||||
"examples": ["爬香山", "爬山"]
|
||||
},
|
||||
"活动": {
|
||||
"pronunciation": "huódòng",
|
||||
"type": "noun",
|
||||
"user_language": "activity",
|
||||
"examples": ["最喜欢的活动", "体育活动"]
|
||||
},
|
||||
"放假": {
|
||||
"pronunciation": "fàng jià",
|
||||
"type": "verb phrase",
|
||||
"user_language": "to have a holiday, to have a vacation",
|
||||
"examples": ["放假期间", "国庆节放假"]
|
||||
},
|
||||
"期间": {
|
||||
"pronunciation": "qījiān",
|
||||
"type": "noun",
|
||||
"user_language": "period, time",
|
||||
"examples": ["放假期间", "学习期间"]
|
||||
},
|
||||
"正是": {
|
||||
"pronunciation": "zhèngshì",
|
||||
"type": "adverb",
|
||||
"user_language": "precisely, exactly",
|
||||
"examples": ["正是最美的时候", "正是这样"]
|
||||
},
|
||||
"利用": {
|
||||
"pronunciation": "lìyòng",
|
||||
"type": "verb",
|
||||
"user_language": "to use, to take advantage of",
|
||||
"examples": ["利用假期", "利用时间"]
|
||||
},
|
||||
"假期": {
|
||||
"pronunciation": "jiàqī",
|
||||
"type": "noun",
|
||||
"user_language": "vacation, holiday",
|
||||
"examples": ["利用假期", "暑假期间"]
|
||||
},
|
||||
"旅游": {
|
||||
"pronunciation": "lǚyóu",
|
||||
"type": "verb",
|
||||
"user_language": "to travel, to tour",
|
||||
"examples": ["到北京来旅游", "去旅游"]
|
||||
},
|
||||
"广场": {
|
||||
"pronunciation": "guǎngchǎng",
|
||||
"type": "noun",
|
||||
"user_language": "square, public plaza",
|
||||
"examples": ["天安门广场", "在广场上"]
|
||||
},
|
||||
"古老": {
|
||||
"pronunciation": "gǔlǎo",
|
||||
"type": "adjective",
|
||||
"user_language": "ancient, old",
|
||||
"examples": ["古老的国家", "古老的城市"]
|
||||
},
|
||||
"国家": {
|
||||
"pronunciation": "guójiā",
|
||||
"type": "noun",
|
||||
"user_language": "country, nation",
|
||||
"examples": ["古老的国家", "世界各国"]
|
||||
},
|
||||
"年轻": {
|
||||
"pronunciation": "niánqīng",
|
||||
"type": "adjective",
|
||||
"user_language": "young",
|
||||
"examples": ["显得多么年轻", "年轻人"]
|
||||
},
|
||||
"和平": {
|
||||
"pronunciation": "hépíng",
|
||||
"type": "noun",
|
||||
"user_language": "peace",
|
||||
"examples": ["热爱和平", "世界和平"]
|
||||
},
|
||||
"热情": {
|
||||
"pronunciation": "rèqíng",
|
||||
"type": "adjective",
|
||||
"user_language": "enthusiastic, warm",
|
||||
"examples": ["多么热情", "热情友好", "热情地欢迎"]
|
||||
}
|
||||
},
|
||||
"grammar": {
|
||||
"na-lai-shuo": {
|
||||
"title": "拿...来说 - to take as an example",
|
||||
"pattern": "拿 + noun + 来 + verb (说/看/讲/比较/分析)",
|
||||
"explanation": "Structure used to introduce a topic or example. The verb is limited to 说, 看, 讲 (to say, to look at, to speak) or 比, 比较, 分析 (to compare, to analyze), etc.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "就拿首都北京来说吧,从三月到五月是春季。",
|
||||
"pronunciation": "Jiù ná shǒudū Běijīng lái shuō ba, cóng sān yuè dào wǔ yuè shì chūnjì.",
|
||||
"translation": "Take the capital Beijing for example, from March to May is spring."
|
||||
},
|
||||
{
|
||||
"chinese": "汉语的一些语法对于外国学习者是比较难的,拿"了"和"把"字句的用法来说,很多人虽然学了,但是还是不知道怎么用。",
|
||||
"pronunciation": "Hànyǔ de yìxiē yǔfǎ duìyú wàiguó xuéxí zhě shì bǐjiào nán de, ná 'le' hé 'bǎ' zì jù de yòngfǎ lái shuō, hěn duō rén suīrán xué le, dànshì háishì bù zhīdào zěnme yòng.",
|
||||
"translation": "Some Chinese grammar is quite difficult for foreign learners. Take the usage of '了' and '把' sentence patterns for example - many people still don't know how to use them even after learning."
|
||||
},
|
||||
{
|
||||
"chinese": "中国这些年发展很快,拿人们的生活水平来说,比过去有很大的提高。",
|
||||
"pronunciation": "Zhōngguó zhèxiē nián fāzhǎn hěn kuài, ná rénmen de shēnghuó shuǐpíng lái shuō, bǐ guòqù yǒu hěn dà de tígāo.",
|
||||
"translation": "China has developed rapidly in recent years. Speaking of people's living standards, there has been great improvement compared to the past."
|
||||
}
|
||||
]
|
||||
},
|
||||
"verb-xia": {
|
||||
"title": "动词 + 下 - directional complement 'down/off'",
|
||||
"explanation": "The directional complement 下 has two common meanings: 1) Indicates completion of action with separation (taking off, removing). 2) Indicates movement from high to low position.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "一到春天,人们都脱下冬衣,换上春装。",
|
||||
"pronunciation": "Yí dào chūntiān, rénmen dōu tuō xià dōngyī, huàn shàng chūnzhuāng.",
|
||||
"translation": "As soon as spring arrives, people take off their winter clothes and put on spring outfits.",
|
||||
"note": "Separation - taking off"
|
||||
},
|
||||
{
|
||||
"chinese": "她一进屋就脱下皮鞋,换上拖鞋。",
|
||||
"pronunciation": "Tā yī jìn wū jiù tuō xià píxié, huàn shàng tuōxié.",
|
||||
"translation": "As soon as she entered the house, she took off her leather shoes and put on slippers.",
|
||||
"note": "Separation - taking off"
|
||||
},
|
||||
{
|
||||
"chinese": "请同学们快坐下,我们上课了。",
|
||||
"pronunciation": "Qǐng tóngxuémen kuài zuò xià, wǒmen shàngkè le.",
|
||||
"translation": "Students, please sit down quickly, let's start class.",
|
||||
"note": "Downward movement - sitting down"
|
||||
},
|
||||
{
|
||||
"chinese": "她感动得流下了眼泪。",
|
||||
"pronunciation": "Tā gǎndòng de liú xià le yǎnlèi.",
|
||||
"translation": "She was so moved that tears flowed down.",
|
||||
"note": "Downward movement"
|
||||
}
|
||||
]
|
||||
},
|
||||
"verb-shang": {
|
||||
"title": "动词 + 上 - directional complement 'up/on'",
|
||||
"explanation": "The directional complement 上 has two common meanings: 1) Indicates result of action, sometimes with closing/attaching meaning (putting on, falling in love, closing). 2) Indicates movement from low to high position.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "一到春天,人们都脱下冬衣,换上春装。",
|
||||
"pronunciation": "Yí dào chūntiān, rénmen dōu tuō xià dōngyī, huàn shàng chūnzhuāng.",
|
||||
"translation": "As soon as spring arrives, people take off winter clothes and put on spring outfits.",
|
||||
"note": "Result - putting on"
|
||||
},
|
||||
{
|
||||
"chinese": "刚来时不习惯,一年后她已经爱上了这个地方,不愿意离开了。",
|
||||
"pronunciation": "Gāng lái shí bù xíguàn, yī nián hòu tā yǐjīng ài shàng le zhège dìfāng, bù yuànyì líkāi le.",
|
||||
"translation": "At first she wasn't used to it, but after a year she had fallen in love with this place and didn't want to leave.",
|
||||
"note": "Result - falling in love"
|
||||
},
|
||||
{
|
||||
"chinese": "他提着书爬上了十楼。",
|
||||
"pronunciation": "Tā tízhe shū pá shàng le shí lóu.",
|
||||
"translation": "He climbed up to the tenth floor carrying books.",
|
||||
"note": "Upward movement"
|
||||
},
|
||||
{
|
||||
"chinese": "她今年终于考上了大学。",
|
||||
"pronunciation": "Tā jīnnián zhōngyú kǎo shàng le dàxué.",
|
||||
"translation": "She finally got into university this year.",
|
||||
"note": "Result - successful exam"
|
||||
}
|
||||
]
|
||||
},
|
||||
"duome": {
|
||||
"title": "多么 - what/how (exclamatory)",
|
||||
"explanation": "Mainly used in exclamatory sentences to express a high degree. Usage is basically the same as the adverb 多.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "要是你能到天安门广场去看看,就会知道,这个古老的国家如今显得多么年轻。",
|
||||
"pronunciation": "Yàoshi nǐ néng dào Tiān'ānmén Guǎngchǎng qù kànkan, jiù huì zhīdào, zhège gǔlǎo de guójiā rújīn xiǎnde duōme niánqīng.",
|
||||
"translation": "If you can go to Tiananmen Square and have a look, you'll know how young this ancient country appears today."
|
||||
},
|
||||
{
|
||||
"chinese": "你去了就会知道,那里的风景有多么/多美。",
|
||||
"pronunciation": "Nǐ qù le jiù huì zhīdào, nàlǐ de fēngjǐng yǒu duōme/duō měi.",
|
||||
"translation": "Once you go there, you'll know how beautiful the scenery is."
|
||||
},
|
||||
{
|
||||
"chinese": "多么/多有意思啊!",
|
||||
"pronunciation": "Duōme/duō yǒu yìsi a!",
|
||||
"translation": "How interesting!"
|
||||
}
|
||||
]
|
||||
},
|
||||
"yexu": {
|
||||
"title": "也许 - perhaps, maybe",
|
||||
"explanation": "Expresses speculation or uncertainty. Usually placed before verbs, adjectives, or subjects as an adverbial.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "来了以后,也许你会爱上这个美丽的城市,爱上这些热情友好的人们。",
|
||||
"pronunciation": "Lái le yǐhòu, yěxǔ nǐ huì ài shàng zhège měilì de chéngshì, ài shàng zhèxiē rèqíng yǒuhǎo de rénmen.",
|
||||
"translation": "After coming here, perhaps you'll fall in love with this beautiful city and these warm, friendly people."
|
||||
},
|
||||
{
|
||||
"chinese": "别着急,再好好儿找找,也许能找到。",
|
||||
"pronunciation": "Bié zhāojí, zài hǎohāor zhǎozhao, yěxǔ néng zhǎodào.",
|
||||
"translation": "Don't worry, look carefully again, maybe you can find it."
|
||||
},
|
||||
{
|
||||
"chinese": "到现在他还没来,也许就不来了,我们不要等他了。",
|
||||
"pronunciation": "Dào xiànzài tā hái méi lái, yěxǔ jiù bù lái le, wǒmen bú yào děng tā le.",
|
||||
"translation": "He still hasn't come until now, maybe he won't come at all, let's not wait for him anymore."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"texts": [
|
||||
{
|
||||
"id": "four-seasons-main",
|
||||
"title": "北京的四季 (Four Seasons in Beijing)",
|
||||
"type": "main",
|
||||
"content": "中国的大部分地区,一年都有春、夏、秋、冬四个季节。就拿首都北京来说吧,从三月到五月是春季,六月到八月是夏季,九月到十一月是秋季,十二月到第二年的二月是冬季。\n\n春天来了,树绿了,花儿开了,天气暖和了。人们脱下冬衣,换上春装。姑娘和小伙子们打扮得漂漂亮亮的,他们在湖上划船,在花儿前照相,公园里充满了年轻人的歌声和笑声。颐和园、北海、香山、长城和十三陵……到处都可以看到来自世界各地的游人。\n\n夏天来了,天气热了。人们常常去游泳。吃完晚饭,工作了一天的人们喜欢到外边散步、聊天儿。马路边、公园里都有散步的人。他们一边走一边聊,显得轻松而愉快。\n\n北京的冬天比较冷,但是暖气一开,屋子里很暖和。到了冬天,人们喜欢吃火锅儿。一家几口人或三五个朋友,高高兴兴地围坐在火锅儿旁边,边吃,边喝,边聊,这情景让人羡慕和向往。\n\n北京的冬天不常下雪,但是,要是下了雪,人们就会像过节一样高兴。冬天最美的风光就是雪景了。很多人会带上相机去外边照相。孩子们一点儿也不怕冷,在雪地上跑啊跳啊,堆雪人儿,打雪仗,小脸和小手冻得红红的,玩儿得可高兴了。北京人喜欢雪。"瑞雪兆丰年",冬天要是下几场大雪,第二年一定会有好收成。\n\n北京一年中最好的季节要数秋天了。天气不冷也不热,不常下雨,也很少刮风。大街上到处是鲜花,到处是瓜果。每到周末,人们都喜欢到郊外去玩儿。那满山的红叶是秋天最美丽的景色。爬香山、看红叶,是北京人最喜欢的活动。\n\n国庆节放假期间,正是北京一年中风景最美的时候。每到国庆节,全国各地很多游人都会利用假期到北京来旅游。要是你能到天安门广场去看看,就会知道,这个古老的国家如今显得多么年轻,你就会感到,勤劳善良、热爱和平的中国人是多么热情。也许你会爱上这个美丽的城市,爱上这些热情友好的人们。\n\n亲爱的朋友,愿你们在北京、在中国生活得平安快乐。",
|
||||
"wordCount": 520,
|
||||
"questions": [
|
||||
{
|
||||
"question": "北京一年有几个季节?每个季节从几月到几月?",
|
||||
"type": "open",
|
||||
"answer": "北京一年有四个季节:春季(3-5月)、夏季(6-8月)、秋季(9-11月)、冬季(12月-次年2月)"
|
||||
},
|
||||
{
|
||||
"question": "北京的春天有什么特点?",
|
||||
"type": "open",
|
||||
"answer": "树绿了,花儿开了,天气暖和,人们换上春装,公园里充满歌声和笑声,到处都是游人"
|
||||
},
|
||||
{
|
||||
"question": "北京人冬天喜欢做什么?",
|
||||
"type": "open",
|
||||
"answer": "吃火锅儿、看雪景、堆雪人儿、打雪仗"
|
||||
},
|
||||
{
|
||||
"question": "北京一年中最好的季节是什么?为什么?",
|
||||
"type": "open",
|
||||
"answer": "秋天。因为天气不冷也不热,不常下雨,也很少刮风,到处是鲜花和瓜果,红叶很美丽"
|
||||
},
|
||||
{
|
||||
"question": ""瑞雪兆丰年"是什么意思?",
|
||||
"type": "open",
|
||||
"answer": "冬天下雪预示着第二年会有好收成"
|
||||
},
|
||||
{
|
||||
"question": "北京的冬天总是下雪。",
|
||||
"type": "true_false",
|
||||
"answer": "错"
|
||||
},
|
||||
{
|
||||
"question": "秋天是北京最好的季节。",
|
||||
"type": "true_false",
|
||||
"answer": "对"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"exercises": [
|
||||
{
|
||||
"type": "phonetics",
|
||||
"title": "辨音辨调 (Distinguish the pronunciations and tones)",
|
||||
"description": "Practice distinguishing similar sounds with different tones",
|
||||
"questions": [
|
||||
{
|
||||
"word1": "部分 (bùfen) - part",
|
||||
"word2": "不分 (bù fēn) - don't distinguish"
|
||||
},
|
||||
{
|
||||
"word1": "旅游 (lǚyóu) - tourism",
|
||||
"word2": "理由 (lǐyóu) - reason"
|
||||
},
|
||||
{
|
||||
"word1": "善良 (shànliáng) - kind",
|
||||
"word2": "商量 (shāngliang) - discuss"
|
||||
},
|
||||
{
|
||||
"word1": "鲜花 (xiānhuā) - fresh flower",
|
||||
"word2": "闲话 (xiánhuà) - gossip"
|
||||
},
|
||||
{
|
||||
"word1": "和平 (hépíng) - peace",
|
||||
"word2": "合并 (hébìng) - merge"
|
||||
},
|
||||
{
|
||||
"word1": "广场 (guǎngchǎng) - square/plaza",
|
||||
"word2": "工厂 (gōngchǎng) - factory"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "fill_in_blanks",
|
||||
"title": "选词填空 (Choose the right words to fill in the blanks)",
|
||||
"description": "Use the word bank to complete the sentences",
|
||||
"wordBank": ["热爱", "向往", "脱", "多么", "数", "也许", "围", "划船", "冻", "充满"],
|
||||
"questions": [
|
||||
{
|
||||
"question": "进屋要____鞋,觉得特麻烦。",
|
||||
"correctAnswer": "脱"
|
||||
},
|
||||
{
|
||||
"question": "星期天我们去公园____吧。",
|
||||
"correctAnswer": "划船"
|
||||
},
|
||||
{
|
||||
"question": "她对自己的未来____信心。",
|
||||
"correctAnswer": "充满"
|
||||
},
|
||||
{
|
||||
"question": "那是个让世界各国的人都十分____的地方。",
|
||||
"correctAnswer": "向往"
|
||||
},
|
||||
{
|
||||
"question": "我的手已经____得没有感觉了。",
|
||||
"correctAnswer": "冻"
|
||||
},
|
||||
{
|
||||
"question": "要说个子高,张东还____不上,他只是中等个子。",
|
||||
"correctAnswer": "数"
|
||||
},
|
||||
{
|
||||
"question": "没有去过云南的人,就不会知道那是一个____美丽的地方。",
|
||||
"correctAnswer": "多么"
|
||||
},
|
||||
{
|
||||
"question": "我们的人民____和平,希望和世界各国人民友好相处。",
|
||||
"correctAnswer": "热爱"
|
||||
},
|
||||
{
|
||||
"question": "刚去时当然会感到寂寞,会想家。但是,如果你语言通了,再交一些好朋友,____你就不想回来了。",
|
||||
"correctAnswer": "也许"
|
||||
},
|
||||
{
|
||||
"question": "中国的春节跟我们的圣诞节一样,也是一个全家____的节日。",
|
||||
"correctAnswer": "围"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
836
content/chapters/hanyu-chapter4.json
Normal file
836
content/chapters/hanyu-chapter4.json
Normal file
@ -0,0 +1,836 @@
|
||||
{
|
||||
"id": "hanyu-chapter4",
|
||||
"book_id": "hanyu-jiaocheng",
|
||||
"name": "理想 (Lǐxiǎng) - Ideal",
|
||||
"description": "Stories about pursuing dreams, overcoming difficulties, and persevering toward one's ideals. Learn about studying Chinese, making friends, and facing challenges.",
|
||||
"difficulty": "intermediate",
|
||||
"language": "zh-CN",
|
||||
"chapter_number": "4",
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2025-10-23",
|
||||
"updated": "2025-10-23",
|
||||
"source": "Hanyu Jiaocheng - Jiaotong University",
|
||||
"target_level": "intermediate",
|
||||
"estimated_hours": 12,
|
||||
"prerequisites": ["hanyu-chapter1", "hanyu-chapter2", "hanyu-chapter3"],
|
||||
"learning_objectives": [
|
||||
"Master 80+ vocabulary terms related to ideals, dreams, and life choices",
|
||||
"Understand patterns: 一点儿+也/都+不, 当然, 不过, 简直",
|
||||
"Learn adverbs: 从 (ever), 偷偷儿 (secretly)",
|
||||
"Practice 动词+着+动词+着 structure",
|
||||
"Develop reading comprehension about personal growth and perseverance"
|
||||
],
|
||||
"content_tags": ["ideals", "dreams", "study-abroad", "perseverance", "life-choices"],
|
||||
"completion_criteria": {
|
||||
"vocabulary_mastery": 85,
|
||||
"comprehension_score": 80,
|
||||
"exercises_completed": 20
|
||||
}
|
||||
},
|
||||
"vocabulary": {
|
||||
"中学": {
|
||||
"pronunciation": "zhōngxué",
|
||||
"type": "noun",
|
||||
"user_language": "middle school and high school",
|
||||
"examples": ["中学毕业", "上中学"]
|
||||
},
|
||||
"毕业": {
|
||||
"pronunciation": "bìyè",
|
||||
"type": "verb",
|
||||
"user_language": "to graduate",
|
||||
"examples": ["中学毕业那年", "大学毕业"]
|
||||
},
|
||||
"考": {
|
||||
"pronunciation": "kǎo",
|
||||
"type": "verb",
|
||||
"user_language": "to take an exam, to test",
|
||||
"examples": ["考什么大学", "考试", "考上大学"]
|
||||
},
|
||||
"大学": {
|
||||
"pronunciation": "dàxué",
|
||||
"type": "noun",
|
||||
"user_language": "university, college",
|
||||
"examples": ["考上大学", "上大学", "北京大学"]
|
||||
},
|
||||
"清楚": {
|
||||
"pronunciation": "qīngchu",
|
||||
"type": "adjective",
|
||||
"user_language": "clear",
|
||||
"examples": ["我也不清楚", "说得很清楚"]
|
||||
},
|
||||
"电影": {
|
||||
"pronunciation": "diànyǐng",
|
||||
"type": "noun",
|
||||
"user_language": "movie, film",
|
||||
"examples": ["看电影", "一个电影"]
|
||||
},
|
||||
"介绍": {
|
||||
"pronunciation": "jièshào",
|
||||
"type": "verb",
|
||||
"user_language": "to introduce, to present",
|
||||
"examples": ["介绍中国文化", "介绍朋友"]
|
||||
},
|
||||
"文化": {
|
||||
"pronunciation": "wénhuà",
|
||||
"type": "noun",
|
||||
"user_language": "culture",
|
||||
"examples": ["中国文化", "文化知识"]
|
||||
},
|
||||
"有意思": {
|
||||
"pronunciation": "yǒu yìsi",
|
||||
"type": "adjective phrase",
|
||||
"user_language": "interesting",
|
||||
"examples": ["很有意思", "多么有意思"]
|
||||
},
|
||||
"将来": {
|
||||
"pronunciation": "jiānglái",
|
||||
"type": "noun",
|
||||
"user_language": "future",
|
||||
"examples": ["将来当翻译", "将来的计划"]
|
||||
},
|
||||
"翻译": {
|
||||
"pronunciation": "fānyì",
|
||||
"type": "noun/verb",
|
||||
"user_language": "translator; to translate",
|
||||
"examples": ["当翻译", "翻译这本书"]
|
||||
},
|
||||
"想法": {
|
||||
"pronunciation": "xiǎngfǎ",
|
||||
"type": "noun",
|
||||
"user_language": "idea, opinion",
|
||||
"examples": ["我的想法", "好想法"]
|
||||
},
|
||||
"考上": {
|
||||
"pronunciation": "kǎo shàng",
|
||||
"type": "verb complement",
|
||||
"user_language": "to be admitted (to school through examination)",
|
||||
"examples": ["考上了大学", "考上北京大学"],
|
||||
"notes": "Resultative complement indicating success"
|
||||
},
|
||||
"暑假": {
|
||||
"pronunciation": "shǔjià",
|
||||
"type": "noun",
|
||||
"user_language": "summer vacation",
|
||||
"examples": ["暑假期间", "暑假去旅游"]
|
||||
},
|
||||
"了解": {
|
||||
"pronunciation": "liǎojiě",
|
||||
"type": "verb",
|
||||
"user_language": "to understand, to know about",
|
||||
"examples": ["对中国的了解太少", "了解情况"]
|
||||
},
|
||||
"困难": {
|
||||
"pronunciation": "kùnnan",
|
||||
"type": "noun/adjective",
|
||||
"user_language": "difficulty; difficult",
|
||||
"examples": ["遇到困难", "很困难"]
|
||||
},
|
||||
"好心人": {
|
||||
"pronunciation": "hǎoxīnrén",
|
||||
"type": "noun",
|
||||
"user_language": "kind-hearted person, good samaritan",
|
||||
"examples": ["得到好心人的帮助"]
|
||||
},
|
||||
"帮助": {
|
||||
"pronunciation": "bāngzhù",
|
||||
"type": "verb/noun",
|
||||
"user_language": "to help; help",
|
||||
"examples": ["需要帮助", "帮助我", "得到帮助"]
|
||||
},
|
||||
"火车": {
|
||||
"pronunciation": "huǒchē",
|
||||
"type": "noun",
|
||||
"user_language": "train",
|
||||
"examples": ["坐火车", "火车票"]
|
||||
},
|
||||
"愿意": {
|
||||
"pronunciation": "yuànyì",
|
||||
"type": "auxiliary verb",
|
||||
"user_language": "to be willing, to want to",
|
||||
"examples": ["要是你愿意", "我愿意帮你"]
|
||||
},
|
||||
"互相": {
|
||||
"pronunciation": "hùxiāng",
|
||||
"type": "adverb",
|
||||
"user_language": "mutually, each other",
|
||||
"examples": ["互相学习", "互相帮助"]
|
||||
},
|
||||
"导游": {
|
||||
"pronunciation": "dǎoyóu",
|
||||
"type": "noun",
|
||||
"user_language": "tour guide",
|
||||
"examples": ["成了我的导游", "当导游"]
|
||||
},
|
||||
"有名": {
|
||||
"pronunciation": "yǒumíng",
|
||||
"type": "adjective",
|
||||
"user_language": "famous, well-known",
|
||||
"examples": ["有名的地方", "很有名"]
|
||||
},
|
||||
"肯定": {
|
||||
"pronunciation": "kěndìng",
|
||||
"type": "adverb/adjective",
|
||||
"user_language": "certainly; certain",
|
||||
"examples": ["肯定会再来", "我很肯定"]
|
||||
},
|
||||
"实现": {
|
||||
"pronunciation": "shíxiàn",
|
||||
"type": "verb",
|
||||
"user_language": "to realize, to achieve",
|
||||
"examples": ["实现理想", "实现梦想"]
|
||||
},
|
||||
"歌": {
|
||||
"pronunciation": "gē",
|
||||
"type": "noun",
|
||||
"user_language": "song",
|
||||
"examples": ["一首中文歌", "唱歌"]
|
||||
},
|
||||
"歌词": {
|
||||
"pronunciation": "gēcí",
|
||||
"type": "noun",
|
||||
"user_language": "lyrics",
|
||||
"examples": ["一句歌词", "歌词很美"]
|
||||
},
|
||||
"经历": {
|
||||
"pronunciation": "jīnglì",
|
||||
"type": "verb/noun",
|
||||
"user_language": "to experience; experience",
|
||||
"examples": ["不经历风雨", "人生经历"]
|
||||
},
|
||||
"尝": {
|
||||
"pronunciation": "cháng",
|
||||
"type": "verb",
|
||||
"user_language": "to taste, to experience",
|
||||
"examples": ["尝到了酸甜苦辣", "尝尝这个菜"]
|
||||
},
|
||||
"哭": {
|
||||
"pronunciation": "kū",
|
||||
"type": "verb",
|
||||
"user_language": "to cry",
|
||||
"examples": ["一个人哭", "哭着哭着就睡着了"]
|
||||
},
|
||||
"睡着": {
|
||||
"pronunciation": "shuìzháo",
|
||||
"type": "verb complement",
|
||||
"user_language": "to fall asleep",
|
||||
"examples": ["哭着哭着就睡着了", "已经睡着了"]
|
||||
},
|
||||
"家乡": {
|
||||
"pronunciation": "jiāxiāng",
|
||||
"type": "noun",
|
||||
"user_language": "hometown, native place",
|
||||
"examples": ["梦见了家乡", "我的家乡"]
|
||||
},
|
||||
"输": {
|
||||
"pronunciation": "shū",
|
||||
"type": "verb",
|
||||
"user_language": "to lose (a competition)",
|
||||
"examples": ["输了", "不想输"]
|
||||
},
|
||||
"回国": {
|
||||
"pronunciation": "huí guó",
|
||||
"type": "verb phrase",
|
||||
"user_language": "to return to one's country",
|
||||
"examples": ["父母叫我回国", "回国工作"]
|
||||
},
|
||||
"留学": {
|
||||
"pronunciation": "liúxué",
|
||||
"type": "verb",
|
||||
"user_language": "to study abroad",
|
||||
"examples": ["来中国留学", "留学生活"]
|
||||
},
|
||||
"各种各样": {
|
||||
"pronunciation": "gèzhǒng gèyàng",
|
||||
"type": "adjective phrase",
|
||||
"user_language": "all kinds of, various",
|
||||
"examples": ["各种各样的困难", "各种各样的人"]
|
||||
},
|
||||
"坚持": {
|
||||
"pronunciation": "jiānchí",
|
||||
"type": "verb",
|
||||
"user_language": "to persist, to persevere",
|
||||
"examples": ["坚持下去", "坚持就是胜利"]
|
||||
},
|
||||
"胜利": {
|
||||
"pronunciation": "shènglì",
|
||||
"type": "noun/verb",
|
||||
"user_language": "victory; to win",
|
||||
"examples": ["坚持就是胜利", "取得胜利"]
|
||||
},
|
||||
"老师": {
|
||||
"pronunciation": "lǎoshī",
|
||||
"type": "noun",
|
||||
"user_language": "teacher",
|
||||
"examples": ["老师鼓励我", "当老师"]
|
||||
},
|
||||
"努力": {
|
||||
"pronunciation": "nǔlì",
|
||||
"type": "verb/adjective",
|
||||
"user_language": "to make an effort; hardworking",
|
||||
"examples": ["艰苦的努力", "努力学习"]
|
||||
},
|
||||
"必须": {
|
||||
"pronunciation": "bìxū",
|
||||
"type": "auxiliary verb",
|
||||
"user_language": "must, have to",
|
||||
"examples": ["必须付出努力", "必须坚持"]
|
||||
},
|
||||
"理想": {
|
||||
"pronunciation": "lǐxiǎng",
|
||||
"type": "noun/adjective",
|
||||
"user_language": "ideal, dream",
|
||||
"examples": ["我的理想是当翻译", "理想的工作", "实现理想"]
|
||||
},
|
||||
"专业": {
|
||||
"pronunciation": "zhuānyè",
|
||||
"type": "noun/adjective",
|
||||
"user_language": "major, specialty; professional",
|
||||
"examples": ["学什么专业", "我的专业是中文", "选择专业"]
|
||||
},
|
||||
"当时": {
|
||||
"pronunciation": "dāngshí",
|
||||
"type": "noun",
|
||||
"user_language": "at that time, then",
|
||||
"examples": ["我当时就想", "当时的情况"]
|
||||
},
|
||||
"赞成": {
|
||||
"pronunciation": "zànchéng",
|
||||
"type": "verb",
|
||||
"user_language": "to approve of, to favor, to agree",
|
||||
"examples": ["妈妈十分赞成", "我赞成你的意见", "大家都赞成"]
|
||||
},
|
||||
"系": {
|
||||
"pronunciation": "xì",
|
||||
"type": "noun",
|
||||
"user_language": "department (in a university)",
|
||||
"examples": ["中文系", "历史系", "数学系"]
|
||||
},
|
||||
"著名": {
|
||||
"pronunciation": "zhùmíng",
|
||||
"type": "adjective",
|
||||
"user_language": "famous, well-known",
|
||||
"examples": ["著名的风景区", "著名的大学", "著名的作家"]
|
||||
},
|
||||
"旅途": {
|
||||
"pronunciation": "lǚtú",
|
||||
"type": "noun",
|
||||
"user_language": "on a journey, during a trip",
|
||||
"examples": ["旅途中遇到困难", "旅途很辛苦"]
|
||||
},
|
||||
"宾馆": {
|
||||
"pronunciation": "bīnguǎn",
|
||||
"type": "noun",
|
||||
"user_language": "hotel",
|
||||
"examples": ["找宾馆", "住宾馆", "五星级宾馆"]
|
||||
},
|
||||
"地图": {
|
||||
"pronunciation": "dìtú",
|
||||
"type": "noun",
|
||||
"user_language": "map",
|
||||
"examples": ["看地图", "北京地图", "世界地图"]
|
||||
},
|
||||
"对面": {
|
||||
"pronunciation": "duìmiàn",
|
||||
"type": "noun",
|
||||
"user_language": "opposite, right in front",
|
||||
"examples": ["坐在我对面", "对面的人", "房子对面"]
|
||||
},
|
||||
"好像": {
|
||||
"pronunciation": "hǎoxiàng",
|
||||
"type": "adverb",
|
||||
"user_language": "to look as if, to seem like",
|
||||
"examples": ["好像看出了我的心事", "他好像生病了", "好像要下雨"]
|
||||
},
|
||||
"心事": {
|
||||
"pronunciation": "xīnshì",
|
||||
"type": "noun",
|
||||
"user_language": "something weighing on one's mind, worry",
|
||||
"examples": ["看出了我的心事", "他有心事", "心事重重"]
|
||||
},
|
||||
"交谈": {
|
||||
"pronunciation": "jiāotán",
|
||||
"type": "verb",
|
||||
"user_language": "to come in contact and talk, to chat",
|
||||
"examples": ["我们开始了交谈", "交谈了很久", "愉快地交谈"]
|
||||
},
|
||||
"所": {
|
||||
"pronunciation": "suǒ",
|
||||
"type": "measure word",
|
||||
"user_language": "a measure word for houses, schools, hospitals, etc.",
|
||||
"examples": ["一所大学", "两所学校", "几所医院"]
|
||||
},
|
||||
"简直": {
|
||||
"pronunciation": "jiǎnzhí",
|
||||
"type": "adverb",
|
||||
"user_language": "simply, at all",
|
||||
"examples": ["她简直成了我的导游", "简直不相信", "简直一点儿也听不懂"],
|
||||
"notes": "Used for emphasis or exaggeration"
|
||||
},
|
||||
"分别": {
|
||||
"pronunciation": "fēnbié",
|
||||
"type": "verb",
|
||||
"user_language": "to part, to leave, to say goodbye",
|
||||
"examples": ["分别的时候", "和朋友分别", "分别很久了"]
|
||||
},
|
||||
"彩虹": {
|
||||
"pronunciation": "cǎihóng",
|
||||
"type": "noun",
|
||||
"user_language": "rainbow",
|
||||
"examples": ["怎么见彩虹", "雨后出现了彩虹"]
|
||||
},
|
||||
"意义": {
|
||||
"pronunciation": "yìyì",
|
||||
"type": "noun",
|
||||
"user_language": "significance, meaning",
|
||||
"examples": ["很有意义", "有什么意义", "重要的意义"]
|
||||
},
|
||||
"风雨": {
|
||||
"pronunciation": "fēngyǔ",
|
||||
"type": "noun",
|
||||
"user_language": "wind and rain; trials and hardships",
|
||||
"examples": ["不经历风雨", "经历了很多风雨"],
|
||||
"notes": "Figurative meaning: trials of life"
|
||||
},
|
||||
"成功": {
|
||||
"pronunciation": "chénggōng",
|
||||
"type": "verb/adjective",
|
||||
"user_language": "to succeed; successful",
|
||||
"examples": ["随随便便成功", "取得成功", "成功的人"]
|
||||
},
|
||||
"从": {
|
||||
"pronunciation": "cóng",
|
||||
"type": "adverb",
|
||||
"user_language": "ever (used before negative)",
|
||||
"examples": ["从没有尝过", "从来不吸烟", "从没来过"],
|
||||
"notes": "Equivalent to 从来 in negative usage"
|
||||
},
|
||||
"酸甜苦辣": {
|
||||
"pronunciation": "suān-tián-kǔ-là",
|
||||
"type": "idiom",
|
||||
"user_language": "sour, sweet, bitter, hot; joys and sorrows of life",
|
||||
"examples": ["尝到了酸甜苦辣", "人生的酸甜苦辣"],
|
||||
"notes": "Idiomatic expression for life experiences"
|
||||
},
|
||||
"段": {
|
||||
"pronunciation": "duàn",
|
||||
"type": "measure word",
|
||||
"user_language": "duration (of time); distance; paragraph; part",
|
||||
"examples": ["有一段时间", "一段路", "这一段"]
|
||||
},
|
||||
"梦": {
|
||||
"pronunciation": "mèng",
|
||||
"type": "noun/verb",
|
||||
"user_language": "dream; to dream",
|
||||
"examples": ["做了一个梦", "在梦中", "梦见了家乡"]
|
||||
},
|
||||
"亲人": {
|
||||
"pronunciation": "qīnrén",
|
||||
"type": "noun",
|
||||
"user_language": "relative, one's family member(s)",
|
||||
"examples": ["梦见了家乡的亲人", "我的亲人", "思念亲人"]
|
||||
},
|
||||
"女儿": {
|
||||
"pronunciation": "nǚ'ér",
|
||||
"type": "noun",
|
||||
"user_language": "daughter",
|
||||
"examples": ["你们的傻女儿", "我的女儿", "独生女儿"]
|
||||
},
|
||||
"失败": {
|
||||
"pronunciation": "shībài",
|
||||
"type": "verb",
|
||||
"user_language": "to fail",
|
||||
"examples": ["失败了", "不怕失败", "失败是成功之母"]
|
||||
},
|
||||
"失去": {
|
||||
"pronunciation": "shīqù",
|
||||
"type": "verb",
|
||||
"user_language": "to lose, not to have any more",
|
||||
"examples": ["失去了信心", "失去机会", "失去朋友"]
|
||||
},
|
||||
"信心": {
|
||||
"pronunciation": "xìnxīn",
|
||||
"type": "noun",
|
||||
"user_language": "confidence, faith, belief",
|
||||
"examples": ["失去了信心", "充满信心", "有信心"]
|
||||
},
|
||||
"选择": {
|
||||
"pronunciation": "xuǎnzé",
|
||||
"type": "verb",
|
||||
"user_language": "to choose, to select",
|
||||
"examples": ["自己选择的道路", "选择专业", "选择朋友"]
|
||||
},
|
||||
"道路": {
|
||||
"pronunciation": "dàolù",
|
||||
"type": "noun",
|
||||
"user_language": "road, way; path (in life)",
|
||||
"examples": ["人生的道路", "选择的道路", "正确的道路"]
|
||||
},
|
||||
"人生": {
|
||||
"pronunciation": "rénshēng",
|
||||
"type": "noun",
|
||||
"user_language": "life (human existence)",
|
||||
"examples": ["人生的道路", "人生经历", "人生哲学"]
|
||||
},
|
||||
"退缩": {
|
||||
"pronunciation": "tuìsuō",
|
||||
"type": "verb",
|
||||
"user_language": "to shrink back, to hold back",
|
||||
"examples": ["遇到困难就退缩", "不能退缩", "退缩不前"]
|
||||
},
|
||||
"取得": {
|
||||
"pronunciation": "qǔdé",
|
||||
"type": "verb",
|
||||
"user_language": "to get, to gain",
|
||||
"examples": ["取得成功", "取得进步", "取得好成绩"]
|
||||
},
|
||||
"鼓励": {
|
||||
"pronunciation": "gǔlì",
|
||||
"type": "verb",
|
||||
"user_language": "to encourage",
|
||||
"examples": ["老师鼓励我", "鼓励自己", "互相鼓励"]
|
||||
},
|
||||
"梦想": {
|
||||
"pronunciation": "mèngxiǎng",
|
||||
"type": "noun/verb",
|
||||
"user_language": "dream; to dream",
|
||||
"examples": ["我的梦想", "梦想成真", "梦想当老师"]
|
||||
},
|
||||
"可笑": {
|
||||
"pronunciation": "kěxiào",
|
||||
"type": "adjective",
|
||||
"user_language": "ridiculous, absurd, funny",
|
||||
"examples": ["觉得自己很可笑", "可笑的事", "这太可笑了"]
|
||||
},
|
||||
"坚强": {
|
||||
"pronunciation": "jiānqiáng",
|
||||
"type": "adjective",
|
||||
"user_language": "strong, firm",
|
||||
"examples": ["坚强一些", "坚强的人", "意志坚强"]
|
||||
},
|
||||
"付出": {
|
||||
"pronunciation": "fùchū",
|
||||
"type": "verb",
|
||||
"user_language": "to pay, to give",
|
||||
"examples": ["付出艰苦的努力", "付出代价", "付出时间"]
|
||||
},
|
||||
"艰苦": {
|
||||
"pronunciation": "jiānkǔ",
|
||||
"type": "adjective",
|
||||
"user_language": "hard, difficult",
|
||||
"examples": ["艰苦的努力", "艰苦的生活", "条件艰苦"]
|
||||
},
|
||||
"偷偷儿": {
|
||||
"pronunciation": "tōutōur",
|
||||
"type": "adverb",
|
||||
"user_language": "secretly, stealthily",
|
||||
"examples": ["一个人偷偷地哭", "偷偷儿离开", "偷偷儿放在书包里"]
|
||||
}
|
||||
},
|
||||
"grammar": {
|
||||
"yidianr-ye-bu": {
|
||||
"title": "一点儿 + 也/都 + 不/没…… - not at all",
|
||||
"pattern": "一点儿 + 也/都 + 不/没 + verb/adjective",
|
||||
"explanation": "Structure for complete negation. 一点儿 before negative words expresses absolute negation, equivalent to 'not at all' or 'completely not'.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "我对南京一点儿也不了解。",
|
||||
"pronunciation": "Wǒ duì Nánjīng yìdiǎnr yě bù liǎojiě.",
|
||||
"translation": "I don't know anything about Nanjing at all."
|
||||
},
|
||||
{
|
||||
"chinese": "你说的这件事我一点儿都不知道。",
|
||||
"pronunciation": "Nǐ shuō de zhè jiàn shì wǒ yìdiǎnr dōu bù zhīdào.",
|
||||
"translation": "I don't know anything at all about what you're talking about."
|
||||
},
|
||||
{
|
||||
"chinese": "我一点儿也听不懂中国人说的话。",
|
||||
"pronunciation": "Wǒ yìdiǎnr yě tīng bu dǒng Zhōngguórén shuō de huà.",
|
||||
"translation": "I can't understand what Chinese people say at all."
|
||||
}
|
||||
]
|
||||
},
|
||||
"dangran": {
|
||||
"title": "当然 - of course, naturally",
|
||||
"explanation": "Expresses affirmation and certainty. Means something is obvious or goes without saying. Can be placed before a verb, before a subject, or used independently to answer a question.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "这样当然好,不过,会不会太麻烦你了?",
|
||||
"pronunciation": "Zhèyàng dāngrán hǎo, búguò, huì bu huì tài máfan nǐ le?",
|
||||
"translation": "That would certainly be good, but wouldn't it be too much trouble for you?"
|
||||
},
|
||||
{
|
||||
"chinese": "能考上理想的大学当然好。",
|
||||
"pronunciation": "Néng kǎo shàng lǐxiǎng de dàxué dāngrán hǎo.",
|
||||
"translation": "Getting into your ideal university is certainly good."
|
||||
},
|
||||
{
|
||||
"chinese": "A:你也想去桂林旅行吗? B:当然。",
|
||||
"pronunciation": "A: Nǐ yě xiǎng qù Guìlín lǚxíng ma? B: Dāngrán.",
|
||||
"translation": "A: Do you also want to travel to Guilin? B: Of course."
|
||||
}
|
||||
]
|
||||
},
|
||||
"buguo": {
|
||||
"title": "不过 - but, however",
|
||||
"explanation": "Indicates a shift or contrast in meaning, similar to 但是 but with a milder tone. More commonly used in spoken Chinese. Introduces a qualification or slight contrast.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "这样当然好,不过,会不会太麻烦你了?",
|
||||
"pronunciation": "Zhèyàng dāngrán hǎo, búguò, huì bu huì tài máfan nǐ le?",
|
||||
"translation": "That would certainly be good, but wouldn't it be too much trouble for you?"
|
||||
},
|
||||
{
|
||||
"chinese": "房间不大,不过一个人够住了。",
|
||||
"pronunciation": "Fángjiān bú dà, búguò yí ge rén gòu zhù le.",
|
||||
"translation": "The room isn't big, but it's enough for one person."
|
||||
},
|
||||
{
|
||||
"chinese": "这一课的生词比较多,不过都不难。",
|
||||
"pronunciation": "Zhè yí kè de shēngcí bǐjiào duō, búguò dōu bù nán.",
|
||||
"translation": "This lesson has quite a few new words, but they're not difficult."
|
||||
}
|
||||
]
|
||||
},
|
||||
"jianzhi": {
|
||||
"title": "简直 - simply, practically",
|
||||
"explanation": "Adverb placed before verbs to emphasize that something is completely or almost completely true. Carries an exaggerated or emphatic tone.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "她简直成了我的导游。",
|
||||
"pronunciation": "Tā jiǎnzhí chéng le wǒ de dǎoyóu.",
|
||||
"translation": "She practically became my tour guide."
|
||||
},
|
||||
{
|
||||
"chinese": "他说的是什么?我简直一点儿也听不懂。",
|
||||
"pronunciation": "Tā shuō de shì shénme? Wǒ jiǎnzhí yìdiǎnr yě tīng bu dǒng.",
|
||||
"translation": "What is he saying? I simply can't understand anything at all."
|
||||
},
|
||||
{
|
||||
"chinese": "她汉语说得简直跟中国人一样。",
|
||||
"pronunciation": "Tā Hànyǔ shuō de jiǎnzhí gēn Zhōngguórén yíyàng.",
|
||||
"translation": "She speaks Chinese practically like a native Chinese person."
|
||||
}
|
||||
]
|
||||
},
|
||||
"cong-negative": {
|
||||
"title": "从 - ever (from the past until now)",
|
||||
"explanation": "The adverb 从 means 从来 and indicates that something has been true from the past until now. Used before negative words to express 'never' or 'have never'.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "以前从没有尝过的酸甜苦辣。",
|
||||
"pronunciation": "Yǐqián cóng méiyǒu cháng guò de suān-tián-kǔ-là.",
|
||||
"translation": "The joys and sorrows of life that I had never experienced before."
|
||||
},
|
||||
{
|
||||
"chinese": "我从来不吸烟。",
|
||||
"pronunciation": "Wǒ cónglái bù xīyān.",
|
||||
"translation": "I never smoke."
|
||||
},
|
||||
{
|
||||
"chinese": "我以前从没来过中国。",
|
||||
"pronunciation": "Wǒ yǐqián cóng méi lái guò Zhōngguó.",
|
||||
"translation": "I had never been to China before."
|
||||
}
|
||||
]
|
||||
},
|
||||
"toutour": {
|
||||
"title": "偷偷(儿) - secretly",
|
||||
"explanation": "Means to do something secretly or without others knowing. Placed before verbs or adjectives as an adverbial modifier.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "我常常一个人偷偷地哭。",
|
||||
"pronunciation": "Wǒ chángcháng yí ge rén tōutōu de kū.",
|
||||
"translation": "I often cried secretly by myself."
|
||||
},
|
||||
{
|
||||
"chinese": "他看大家不注意,就偷偷儿离开了。",
|
||||
"pronunciation": "Tā kàn dàjiā bù zhùyì, jiù tōutōur líkāi le.",
|
||||
"translation": "When he saw that no one was paying attention, he secretly left."
|
||||
},
|
||||
{
|
||||
"chinese": "她偷偷儿把一封信放在了我的书包里。",
|
||||
"pronunciation": "Tā tōutōur bǎ yì fēng xìn fàng zài le wǒ de shūbāo lǐ.",
|
||||
"translation": "She secretly put a letter in my schoolbag."
|
||||
}
|
||||
]
|
||||
},
|
||||
"verb-zhe-verb-zhe": {
|
||||
"title": "动词+着 + 动词+着 - while doing, doing (unexpected result)",
|
||||
"explanation": "The structure with duplication of 'verb + 着' indicates that while one action is in progress, another action subsequently occurs, often with an unexpected result.",
|
||||
"examples": [
|
||||
{
|
||||
"chinese": "有时哭着哭着就睡着了。",
|
||||
"pronunciation": "Yǒushí kū zhe kū zhe jiù shuìzháo le.",
|
||||
"translation": "Sometimes I would fall asleep while crying."
|
||||
},
|
||||
{
|
||||
"chinese": "她说着说着突然笑了起来。",
|
||||
"pronunciation": "Tā shuō zhe shuō zhe túrán xiào le qǐlái.",
|
||||
"translation": "While she was talking, she suddenly started laughing."
|
||||
},
|
||||
{
|
||||
"chinese": "上课的时候,常常听着听着就困了。",
|
||||
"pronunciation": "Shàngkè de shíhou, chángcháng tīng zhe tīng zhe jiù kùn le.",
|
||||
"translation": "During class, I often get sleepy while listening."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"texts": [
|
||||
{
|
||||
"id": "ideal-main-text",
|
||||
"title": "理想 (Ideal)",
|
||||
"type": "main",
|
||||
"content": "中学毕业那年,要考什么大学,要学什么专业,我自己也不清楚。一次我和朋友看了一个电影,这个电影是介绍中国文化的,很有意思。我当时就想,学习中文,将来当翻译怎么样?妈妈知道了我的想法,十分赞成。就这样,我考上了大学中文系。\n\n大学三年级暑假,我第一次来到中国,在北京语言大学学习了四个星期。学完以后,又到中国一些著名的风景区旅游了一个月。这时才知道,自己对中国的了解太少了。\n\n因为汉语说得不好,旅途中遇到了很多困难。但是,每次遇到困难时,我都会得到好心人的帮助。\n\n一次,我坐火车去南京。我对南京一点儿也不了解,火车到南京的时间又是晚上,怎么去找宾馆,怎么买去上海的火车票,我都不知道。我看着地图,心里真有点儿着急。\n\n坐在我对面的一个姑娘,好像看出了我的心事,就用英语问我是不是留学生,需要不需要她帮助。她的英语说得很好。我就对她说了自己遇到的困难。她说:"别担心,我也是在南京下车,下车以后,你就跟我走吧。"\n\n就这样,我们开始了交谈。她是南京一所大学的学生。她说:"要是你愿意,我可以带你到南京的一些风景区去看看。"我说:"这样当然好,不过,会不会太麻烦你了?"她说:"现在正好是假期,我有空儿。我们可以互相学习,我帮你练汉语,你也帮我练练英语。"\n\n就这样,我交了第一个中国朋友。\n\n在南京玩儿了三天。这三天里,她简直成了我的导游,带我去了南京很多有名的地方,又帮我买了去上海的火车票。分别的时候,她说,欢迎你再来。我说,肯定会再来的。我一定要把汉语学好,实现自己当翻译的理想。",
|
||||
"wordCount": 452,
|
||||
"questions": [
|
||||
{
|
||||
"question": ""我"为什么要学习中文?",
|
||||
"type": "open",
|
||||
"answer": "看了一个介绍中国文化的电影后,想将来当翻译"
|
||||
},
|
||||
{
|
||||
"question": ""我"第一次来中国是什么时候?来做什么?",
|
||||
"type": "open",
|
||||
"answer": "大学三年级暑假,在北京语言大学学习四个星期,然后旅游一个月"
|
||||
},
|
||||
{
|
||||
"question": ""我"在旅途中遇到了什么困难?是谁帮助了"我"?",
|
||||
"type": "open",
|
||||
"answer": "去南京时不知道怎么找宾馆和买票。一个坐在对面的女大学生帮助了我"
|
||||
},
|
||||
{
|
||||
"question": ""我"的理想是什么?",
|
||||
"type": "open",
|
||||
"answer": "学好汉语,实现当翻译的理想"
|
||||
},
|
||||
{
|
||||
"question": ""我"在中国旅游时总是很顺利。",
|
||||
"type": "true_false",
|
||||
"answer": "错"
|
||||
},
|
||||
{
|
||||
"question": ""我"在南京交了第一个中国朋友。",
|
||||
"type": "true_false",
|
||||
"answer": "对"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rainbow-text",
|
||||
"title": "要见彩虹 (To See the Rainbow)",
|
||||
"type": "extensive",
|
||||
"content": "最近,我学会了一首中文歌,很好听,也很有意义。里边有一句歌词,让我想了很多很多。这句歌词是:不经历风雨,怎么见彩虹?没有人能随随便便成功。\n\n我来中国已经半年了,半年的留学生活让我尝到了以前从没有尝过的酸甜苦辣。有一段时间我常常一个人偷偷地哭,有时哭着哭着就睡着了。在梦中,我梦见了家乡,梦见了家乡的亲人。在梦中我对父母说:"你们的傻女儿输了,失败了,对学习、对自己都失去了信心。"\n\n父母打电话叫我回国,但是,我想我不能回国。来中国留学,学习汉语,这是我自己选择的道路。人生的道路上肯定会遇到各种各样的困难,要是一遇到困难就退缩,怎么可能取得成功呢?我决定坚持下去。老师也常鼓励我说:坚持就是胜利。\n\n我的梦想是当一个汉语老师,不学好汉语怎么能当汉语老师呢?\n\n想到这儿,就觉得自己很可笑,都十八岁了,已经不是小孩子了,为什么一遇到困难就哭呢?为什么不能坚强一些呢?\n\n我心中又唱起了这首歌:不经历风雨,怎么见彩虹?没有人能随随便便成功。是啊,要成功,就必须付出艰苦的努力。",
|
||||
"wordCount": 358,
|
||||
"questions": [
|
||||
{
|
||||
"question": ""我"学会了一首什么歌?歌词的意思是什么?",
|
||||
"type": "open",
|
||||
"answer": "一首中文歌,歌词是:不经历风雨,怎么见彩虹?没有人能随随便便成功。意思是要成功必须经历困难和付出努力"
|
||||
},
|
||||
{
|
||||
"question": ""我"为什么常常一个人偷偷地哭?",
|
||||
"type": "open",
|
||||
"answer": "因为留学生活很艰苦,尝到了酸甜苦辣,对学习和自己失去了信心"
|
||||
},
|
||||
{
|
||||
"question": ""我"为什么要坚持下去?",
|
||||
"type": "open",
|
||||
"answer": "因为这是自己选择的道路,梦想是当汉语老师,不能一遇到困难就退缩"
|
||||
},
|
||||
{
|
||||
"question": ""我"的父母让"我"回国。",
|
||||
"type": "true_false",
|
||||
"answer": "对"
|
||||
},
|
||||
{
|
||||
"question": ""我"决定放弃学习汉语。",
|
||||
"type": "true_false",
|
||||
"answer": "错"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"exercises": [
|
||||
{
|
||||
"type": "phonetics",
|
||||
"title": "辨音辨调 (Distinguish the pronunciations and tones)",
|
||||
"description": "Practice distinguishing similar sounds with different tones",
|
||||
"questions": [
|
||||
{
|
||||
"word1": "专业 (zhuānyè) - major",
|
||||
"word2": "转业 (zhuǎnyè) - to change profession"
|
||||
},
|
||||
{
|
||||
"word1": "著名 (zhùmíng) - famous",
|
||||
"word2": "出名 (chūmíng) - to become famous"
|
||||
},
|
||||
{
|
||||
"word1": "心事 (xīnshì) - worry",
|
||||
"word2": "新诗 (xīnshī) - new poetry"
|
||||
},
|
||||
{
|
||||
"word1": "当然 (dāngrán) - of course",
|
||||
"word2": "坦然 (tǎnrán) - calm"
|
||||
},
|
||||
{
|
||||
"word1": "简直 (jiǎnzhí) - simply",
|
||||
"word2": "兼职 (jiānzhí) - part-time job"
|
||||
},
|
||||
{
|
||||
"word1": "人生 (rénshēng) - life",
|
||||
"word2": "人参 (rénshēn) - ginseng"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "fill_in_blanks",
|
||||
"title": "选词填空 (Choose the right words to fill in the blanks)",
|
||||
"description": "Use the word bank to complete the sentences",
|
||||
"wordBank": ["酸甜苦辣", "付出", "赞成", "信心", "简直", "失败", "心事", "偷偷儿", "经历", "意义", "不过", "分别", "著名", "理想", "当然"],
|
||||
"questions": [
|
||||
{
|
||||
"question": "上大学,学汉语,当翻译,一直是我的____。",
|
||||
"correctAnswer": "理想"
|
||||
},
|
||||
{
|
||||
"question": "妈妈非常____我来中国留学。",
|
||||
"correctAnswer": "赞成"
|
||||
},
|
||||
{
|
||||
"question": "我____不相信他能干出这种事。",
|
||||
"correctAnswer": "简直"
|
||||
},
|
||||
{
|
||||
"question": "这半年来,我尝够了人生的____。",
|
||||
"correctAnswer": "酸甜苦辣"
|
||||
},
|
||||
{
|
||||
"question": "遇到困难时,不要失去____,要鼓励自己。",
|
||||
"correctAnswer": "信心"
|
||||
},
|
||||
{
|
||||
"question": "对我来说,学习汉语的____就是选择了一条人生的道路。",
|
||||
"correctAnswer": "意义"
|
||||
},
|
||||
{
|
||||
"question": "人们常说,____是成功之母,所以,要想成功就不要怕失败。",
|
||||
"correctAnswer": "失败"
|
||||
},
|
||||
{
|
||||
"question": "不____艰苦的努力,要想取得成功是不可能的。",
|
||||
"correctAnswer": "付出"
|
||||
},
|
||||
{
|
||||
"question": "老师在黑板上写字时,他____地走了出去。",
|
||||
"correctAnswer": "偷偷儿"
|
||||
},
|
||||
{
|
||||
"question": "这件羽绒服样子不太好看,____穿着挺暖和。",
|
||||
"correctAnswer": "不过"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -1099,10 +1099,16 @@ class AdventureReader extends Module {
|
||||
<div class="progress-info">
|
||||
<span id="progress-text">Start your adventure!</span>
|
||||
</div>
|
||||
<button class="btn btn-outline btn-sm" id="exit-adventure">
|
||||
<span class="btn-icon">←</span>
|
||||
<span class="btn-text">Exit</span>
|
||||
</button>
|
||||
<div style="display: flex; gap: 8px;">
|
||||
<button class="btn btn-outline btn-sm" id="restart-btn">
|
||||
<span class="btn-icon">🔄</span>
|
||||
<span class="btn-text">Restart</span>
|
||||
</button>
|
||||
<button class="btn btn-outline btn-sm" id="exit-adventure">
|
||||
<span class="btn-icon">←</span>
|
||||
<span class="btn-text">Exit</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1122,7 +1128,6 @@ class AdventureReader extends Module {
|
||||
<div class="content-info" id="content-info">
|
||||
<!-- Content type info will be populated here -->
|
||||
</div>
|
||||
<button class="control-btn secondary" id="restart-btn">🔄 Restart Adventure</button>
|
||||
</div>
|
||||
|
||||
<!-- Reading Modal -->
|
||||
|
||||
@ -282,6 +282,10 @@ class MarioEducational extends Module {
|
||||
this._canvas.removeEventListener('touchmove', this._handleTouchMove);
|
||||
}
|
||||
|
||||
// Restore default touch behaviors
|
||||
document.body.style.overscrollBehavior = '';
|
||||
document.documentElement.style.overscrollBehavior = '';
|
||||
|
||||
// Clear canvas
|
||||
if (this._canvas && this._canvas.parentNode) {
|
||||
this._canvas.parentNode.removeChild(this._canvas);
|
||||
@ -531,8 +535,23 @@ class MarioEducational extends Module {
|
||||
this._canvas.addEventListener('touchend', this._handleTouchEnd);
|
||||
this._canvas.addEventListener('touchmove', this._handleTouchMove);
|
||||
|
||||
// Prevent native touch behaviors (zoom, right-click, pull-to-refresh)
|
||||
this._canvas.addEventListener('touchstart', (e) => e.preventDefault(), { passive: false });
|
||||
this._canvas.addEventListener('touchmove', (e) => e.preventDefault(), { passive: false });
|
||||
this._canvas.addEventListener('contextmenu', (e) => e.preventDefault());
|
||||
|
||||
// Apply CSS to prevent touch behaviors
|
||||
this._canvas.style.touchAction = 'none';
|
||||
this._canvas.style.userSelect = 'none';
|
||||
this._canvas.style.webkitUserSelect = 'none';
|
||||
|
||||
// Prevent page scroll/zoom on document
|
||||
document.body.style.overscrollBehavior = 'none';
|
||||
document.documentElement.style.overscrollBehavior = 'none';
|
||||
|
||||
console.log('🖱️ Mouse event listeners attached to canvas');
|
||||
console.log('👆 Touch event listeners attached to canvas');
|
||||
console.log('🔒 Touch protections enabled (no zoom, no right-click, no scroll)');
|
||||
} else {
|
||||
console.error('❌ Canvas not found when setting up mouse handlers!');
|
||||
}
|
||||
|
||||
@ -442,7 +442,7 @@ class RiverRun extends Module {
|
||||
const wordElement = document.createElement('canvas');
|
||||
wordElement.className = 'floating-word';
|
||||
wordElement.width = trunkWidth;
|
||||
wordElement.height = trunkHeight + 30; // Extra space for text
|
||||
wordElement.height = trunkHeight; // Canvas size matches trunk size exactly
|
||||
wordElement.style.position = 'absolute';
|
||||
wordElement.style.cursor = 'pointer';
|
||||
|
||||
@ -469,8 +469,11 @@ class RiverRun extends Module {
|
||||
|
||||
wordElement.wordData = word;
|
||||
|
||||
// Check if this is the target word
|
||||
const isTargetWord = this._currentTarget && word.french === this._currentTarget.french;
|
||||
|
||||
// Draw the trunk on the canvas
|
||||
this._drawTrunk(wordElement, word.french, trunkWidth, trunkHeight);
|
||||
this._drawTrunk(wordElement, word.french, trunkWidth, trunkHeight, isTargetWord);
|
||||
|
||||
riverCanvas.appendChild(wordElement);
|
||||
this._floatingWords.push({
|
||||
@ -487,17 +490,17 @@ class RiverRun extends Module {
|
||||
}
|
||||
}
|
||||
|
||||
_drawTrunk(canvas, text, width, height) {
|
||||
_drawTrunk(canvas, text, width, height, isTargetWord = false) {
|
||||
const ctx = canvas.getContext('2d');
|
||||
if (!ctx) return;
|
||||
|
||||
// Draw trunk (wood texture)
|
||||
const trunkY = 0;
|
||||
|
||||
// Wood color (brown)
|
||||
const woodColor = '#8B4513';
|
||||
const darkWoodColor = '#654321';
|
||||
const lightWoodColor = '#A0522D';
|
||||
// Wood color (brown) - slightly lighter for target word
|
||||
const woodColor = isTargetWord ? '#9B5523' : '#8B4513';
|
||||
const darkWoodColor = isTargetWord ? '#755331' : '#654321';
|
||||
const lightWoodColor = isTargetWord ? '#B0622D' : '#A0522D';
|
||||
|
||||
// Draw main trunk body
|
||||
ctx.fillStyle = woodColor;
|
||||
@ -538,6 +541,27 @@ class RiverRun extends Module {
|
||||
}
|
||||
ctx.globalAlpha = 1;
|
||||
|
||||
// Draw subtle cracks for target word
|
||||
if (isTargetWord) {
|
||||
ctx.strokeStyle = darkWoodColor;
|
||||
ctx.lineWidth = 1.5;
|
||||
ctx.globalAlpha = 0.4;
|
||||
|
||||
// Diagonal crack from top-left to bottom-right
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(width * 0.2, trunkY + height * 0.1);
|
||||
ctx.lineTo(width * 0.8, trunkY + height * 0.9);
|
||||
ctx.stroke();
|
||||
|
||||
// Small branch crack
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(width * 0.5, trunkY + height * 0.5);
|
||||
ctx.lineTo(width * 0.7, trunkY + height * 0.3);
|
||||
ctx.stroke();
|
||||
|
||||
ctx.globalAlpha = 1;
|
||||
}
|
||||
|
||||
// Draw text on the trunk
|
||||
ctx.fillStyle = '#ffffff';
|
||||
ctx.font = `bold ${Math.max(10, width / 4)}px Arial`;
|
||||
@ -549,10 +573,6 @@ class RiverRun extends Module {
|
||||
ctx.shadowOffsetY = 1;
|
||||
|
||||
ctx.fillText(text, width / 2, trunkY + height / 2);
|
||||
|
||||
// Add text below trunk for clarity
|
||||
ctx.font = `bold ${Math.max(8, width / 5)}px Arial`;
|
||||
ctx.fillText(text, width / 2, trunkY + height + 15);
|
||||
}
|
||||
|
||||
_getRandomWord() {
|
||||
@ -803,6 +823,9 @@ class RiverRun extends Module {
|
||||
this._score += pointsEarned;
|
||||
this._wordsCollected++;
|
||||
|
||||
// Create star explosion effect
|
||||
this._createStarExplosion(wordElement);
|
||||
|
||||
// Show points earned (visual feedback)
|
||||
this._showPointsPopup(wordElement, pointsEarned);
|
||||
|
||||
@ -951,6 +974,82 @@ class RiverRun extends Module {
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
_createStarExplosion(wordElement) {
|
||||
const rect = wordElement.getBoundingClientRect();
|
||||
const riverCanvas = document.getElementById('river-canvas');
|
||||
if (!riverCanvas) return;
|
||||
|
||||
const canvasRect = riverCanvas.getBoundingClientRect();
|
||||
const centerX = rect.left - canvasRect.left + rect.width / 2;
|
||||
const centerY = rect.top - canvasRect.top + rect.height / 2;
|
||||
|
||||
// Create 8 explosion stars
|
||||
const starCount = 8;
|
||||
for (let i = 0; i < starCount; i++) {
|
||||
const angle = (Math.PI * 2 * i) / starCount;
|
||||
const distance = 60 + Math.random() * 40; // Random distance for variation
|
||||
|
||||
this._createExplosionStar(riverCanvas, centerX, centerY, angle, distance);
|
||||
}
|
||||
|
||||
// Create the flying star that goes to the top
|
||||
this._createFlyingStar(riverCanvas, centerX, centerY);
|
||||
}
|
||||
|
||||
_createExplosionStar(container, startX, startY, angle, distance) {
|
||||
const star = document.createElement('div');
|
||||
star.className = 'explosion-star';
|
||||
star.innerHTML = '⭐';
|
||||
star.style.position = 'absolute';
|
||||
star.style.left = `${startX}px`;
|
||||
star.style.top = `${startY}px`;
|
||||
star.style.fontSize = '20px';
|
||||
star.style.pointerEvents = 'none';
|
||||
star.style.zIndex = '150';
|
||||
|
||||
const endX = startX + Math.cos(angle) * distance;
|
||||
const endY = startY + Math.sin(angle) * distance;
|
||||
|
||||
// Calculate animation
|
||||
star.style.setProperty('--end-x', `${endX - startX}px`);
|
||||
star.style.setProperty('--end-y', `${endY - startY}px`);
|
||||
star.style.animation = 'starExplosion 0.8s ease-out forwards';
|
||||
|
||||
container.appendChild(star);
|
||||
|
||||
setTimeout(() => {
|
||||
star.remove();
|
||||
}, 800);
|
||||
}
|
||||
|
||||
_createFlyingStar(container, startX, startY) {
|
||||
const star = document.createElement('div');
|
||||
star.className = 'flying-star';
|
||||
star.innerHTML = '⭐';
|
||||
star.style.position = 'absolute';
|
||||
star.style.left = `${startX}px`;
|
||||
star.style.top = `${startY}px`;
|
||||
star.style.fontSize = '30px';
|
||||
star.style.pointerEvents = 'none';
|
||||
star.style.zIndex = '150';
|
||||
|
||||
// Target: top center of screen (score area)
|
||||
const targetX = container.offsetWidth / 2;
|
||||
const targetY = -50;
|
||||
|
||||
star.style.setProperty('--start-x', `${startX}px`);
|
||||
star.style.setProperty('--start-y', `${startY}px`);
|
||||
star.style.setProperty('--end-x', `${targetX}px`);
|
||||
star.style.setProperty('--end-y', `${targetY}px`);
|
||||
star.style.animation = 'starFlyToTop 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards';
|
||||
|
||||
container.appendChild(star);
|
||||
|
||||
setTimeout(() => {
|
||||
star.remove();
|
||||
}, 1200);
|
||||
}
|
||||
|
||||
async _playSuccessSound(word) {
|
||||
const contentLanguage = this._content?.language || 'zh-CN';
|
||||
await ttsService.speak(word.trim(), contentLanguage, { rate: 0.8, volume: 1.0 });
|
||||
@ -1503,6 +1602,14 @@ class RiverRun extends Module {
|
||||
transform: translate(-50%, 0);
|
||||
}
|
||||
|
||||
.explosion-star {
|
||||
filter: drop-shadow(0 0 8px rgba(255,215,0,0.8));
|
||||
}
|
||||
|
||||
.flying-star {
|
||||
filter: drop-shadow(0 0 12px rgba(255,215,0,1));
|
||||
}
|
||||
|
||||
@keyframes pointsFloat {
|
||||
0% {
|
||||
opacity: 1;
|
||||
@ -1577,6 +1684,35 @@ class RiverRun extends Module {
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes starExplosion {
|
||||
0% {
|
||||
transform: translate(0, 0) scale(1) rotate(0deg);
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
transform: translate(var(--end-x), var(--end-y)) scale(0.3) rotate(360deg);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes starFlyToTop {
|
||||
0% {
|
||||
transform: translate(-50%, -50%) scale(1) rotate(0deg);
|
||||
opacity: 1;
|
||||
}
|
||||
20% {
|
||||
transform: translate(-50%, -50%) scale(1.3) rotate(72deg);
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
transform: translate(
|
||||
calc(var(--end-x) - var(--start-x) - 50%),
|
||||
calc(var(--end-y) - var(--start-y) - 50%)
|
||||
) scale(0.5) rotate(720deg);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.river-run-hud {
|
||||
flex-direction: column;
|
||||
|
||||
@ -212,19 +212,20 @@ class WhackAMole extends Module {
|
||||
style.id = cssId;
|
||||
style.textContent = `
|
||||
.whack-game-wrapper {
|
||||
padding: 8px;
|
||||
max-width: 95vw;
|
||||
padding: 6px;
|
||||
width: 100%;
|
||||
max-width: min(650px, 95vw);
|
||||
margin: 0 auto;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
border-radius: 10px;
|
||||
border-radius: 8px;
|
||||
color: white;
|
||||
min-height: auto;
|
||||
max-height: 90vh;
|
||||
height: 75vh;
|
||||
max-height: 75vh;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.whack-game-header {
|
||||
@ -232,17 +233,18 @@ class WhackAMole extends Module {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
margin-bottom: 8px;
|
||||
padding: 8px;
|
||||
gap: 4px;
|
||||
margin-bottom: 4px;
|
||||
padding: 4px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
border-radius: 6px;
|
||||
backdrop-filter: blur(10px);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.game-stats {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
gap: 3px;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
@ -251,62 +253,66 @@ class WhackAMole extends Module {
|
||||
.stat-item {
|
||||
text-align: center;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
padding: 4px 8px;
|
||||
border-radius: 6px;
|
||||
min-width: 50px;
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
min-width: 45px;
|
||||
flex: 0 1 auto;
|
||||
}
|
||||
|
||||
.stat-value {
|
||||
display: block;
|
||||
font-size: 0.95rem;
|
||||
font-size: clamp(0.75rem, 1.3vh, 0.85rem);
|
||||
font-weight: bold;
|
||||
margin-bottom: 2px;
|
||||
margin-bottom: 1px;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
font-size: 0.65rem;
|
||||
font-size: clamp(0.5rem, 0.9vh, 0.6rem);
|
||||
opacity: 0.9;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.target-display {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
padding: 6px 10px;
|
||||
border-radius: 8px;
|
||||
padding: 3px 8px;
|
||||
border-radius: 6px;
|
||||
text-align: center;
|
||||
border: 2px solid rgba(255, 255, 255, 0.3);
|
||||
min-width: 100px;
|
||||
max-width: 150px;
|
||||
min-width: 90px;
|
||||
max-width: 140px;
|
||||
flex-shrink: 1;
|
||||
}
|
||||
|
||||
.target-label {
|
||||
font-size: 0.65rem;
|
||||
font-size: clamp(0.5rem, 0.9vh, 0.6rem);
|
||||
opacity: 0.9;
|
||||
margin-bottom: 2px;
|
||||
margin-bottom: 1px;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.target-word {
|
||||
font-size: 0.9rem;
|
||||
font-size: clamp(0.7rem, 1.2vh, 0.85rem);
|
||||
font-weight: bold;
|
||||
word-break: break-word;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.game-controls {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
gap: 3px;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.control-btn {
|
||||
padding: 5px 10px;
|
||||
border: 2px solid rgba(255, 255, 255, 0.3);
|
||||
border-radius: 6px;
|
||||
padding: 3px 6px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border-radius: 4px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: white;
|
||||
font-size: 0.7rem;
|
||||
font-size: clamp(0.55rem, 1vh, 0.65rem);
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
@ -314,6 +320,7 @@ class WhackAMole extends Module {
|
||||
white-space: nowrap;
|
||||
min-width: fit-content;
|
||||
flex-shrink: 1;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.control-btn:hover {
|
||||
@ -335,13 +342,16 @@ class WhackAMole extends Module {
|
||||
.whack-game-board {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
margin: 8px 0;
|
||||
padding: 8px;
|
||||
gap: 6px;
|
||||
margin: 0;
|
||||
padding: 6px;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border-radius: 10px;
|
||||
min-height: auto;
|
||||
flex: 1;
|
||||
border-radius: 8px;
|
||||
width: 100%;
|
||||
max-width: 300px;
|
||||
margin: 0 auto;
|
||||
box-sizing: border-box;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.whack-hole {
|
||||
@ -349,11 +359,12 @@ class WhackAMole extends Module {
|
||||
aspect-ratio: 1;
|
||||
background: radial-gradient(circle at center, #8b5cf6 0%, #7c3aed 100%);
|
||||
border-radius: 50%;
|
||||
border: 3px solid rgba(255, 255, 255, 0.3);
|
||||
border: 2px solid rgba(255, 255, 255, 0.3);
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
min-height: 60px;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.whack-hole:hover {
|
||||
@ -367,17 +378,19 @@ class WhackAMole extends Module {
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%) scale(0);
|
||||
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
|
||||
border-radius: 8px;
|
||||
padding: 6px;
|
||||
border-radius: 5px;
|
||||
padding: 3px 5px;
|
||||
color: white;
|
||||
text-align: center;
|
||||
font-weight: 600;
|
||||
font-size: 0.75rem;
|
||||
font-size: clamp(0.55rem, 1.1vh, 0.7rem);
|
||||
line-height: 1.15;
|
||||
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
||||
cursor: pointer;
|
||||
max-width: 85%;
|
||||
max-width: 90%;
|
||||
word-wrap: break-word;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.whack-mole.active {
|
||||
@ -395,28 +408,31 @@ class WhackAMole extends Module {
|
||||
}
|
||||
|
||||
.pronunciation {
|
||||
font-size: 0.65rem;
|
||||
font-size: clamp(0.48rem, 0.9vh, 0.6rem);
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
font-style: italic;
|
||||
margin-bottom: 3px;
|
||||
margin-bottom: 1px;
|
||||
font-weight: 400;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.feedback-area {
|
||||
text-align: center;
|
||||
padding: 10px;
|
||||
padding: 4px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
margin-top: 10px;
|
||||
border-radius: 6px;
|
||||
margin-top: 4px;
|
||||
backdrop-filter: blur(10px);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.instruction {
|
||||
font-size: 0.85rem;
|
||||
font-size: clamp(0.65rem, 1.1vh, 0.75rem);
|
||||
font-weight: 500;
|
||||
padding: 8px;
|
||||
border-radius: 6px;
|
||||
padding: 4px;
|
||||
border-radius: 4px;
|
||||
transition: all 0.3s ease;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.instruction.info {
|
||||
@ -590,12 +606,12 @@ class WhackAMole extends Module {
|
||||
|
||||
/* Ensure Exit button uses control-btn styles */
|
||||
#exit-whack {
|
||||
padding: 5px 10px !important;
|
||||
border: 2px solid rgba(255, 255, 255, 0.3) !important;
|
||||
border-radius: 6px;
|
||||
padding: 3px 6px !important;
|
||||
border: 1px solid rgba(255, 255, 255, 0.3) !important;
|
||||
border-radius: 4px;
|
||||
background: rgba(255, 255, 255, 0.1) !important;
|
||||
color: white !important;
|
||||
font-size: 0.7rem !important;
|
||||
font-size: clamp(0.55rem, 1vh, 0.65rem) !important;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
@ -603,6 +619,7 @@ class WhackAMole extends Module {
|
||||
white-space: nowrap;
|
||||
min-width: fit-content;
|
||||
flex-shrink: 1;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
#exit-whack:hover {
|
||||
@ -612,72 +629,29 @@ class WhackAMole extends Module {
|
||||
|
||||
#exit-whack .btn-icon,
|
||||
#exit-whack .btn-text {
|
||||
font-size: 0.7rem;
|
||||
font-size: clamp(0.55rem, 1vh, 0.65rem);
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
/* Media queries pour ajustements mineurs sur très petits écrans */
|
||||
@media (max-width: 400px) {
|
||||
.whack-game-wrapper {
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.whack-game-header {
|
||||
gap: 4px;
|
||||
padding: 6px;
|
||||
margin-bottom: 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.stat-item {
|
||||
padding: 3px 6px;
|
||||
min-width: 45px;
|
||||
}
|
||||
|
||||
.stat-value {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
font-size: 0.6rem;
|
||||
}
|
||||
|
||||
.target-display {
|
||||
padding: 4px 8px;
|
||||
min-width: 90px;
|
||||
max-width: 120px;
|
||||
}
|
||||
}
|
||||
|
||||
.target-word {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.game-controls {
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.control-btn,
|
||||
#exit-whack {
|
||||
padding: 4px 8px !important;
|
||||
font-size: 0.65rem !important;
|
||||
}
|
||||
|
||||
#exit-whack .btn-icon,
|
||||
#exit-whack .btn-text {
|
||||
font-size: 0.65rem;
|
||||
}
|
||||
|
||||
.whack-game-board {
|
||||
gap: 6px;
|
||||
padding: 6px;
|
||||
margin: 6px 0;
|
||||
}
|
||||
|
||||
.whack-hole {
|
||||
min-height: 50px;
|
||||
border-width: 2px;
|
||||
}
|
||||
|
||||
.whack-mole {
|
||||
font-size: 0.65rem;
|
||||
padding: 4px;
|
||||
/* Ajustements pour écrans très larges */
|
||||
@media (min-width: 1200px) {
|
||||
.whack-game-wrapper {
|
||||
max-width: 650px;
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@ -1514,6 +1514,12 @@ class WizardSpellCaster extends Module {
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable cast button immediately to prevent spam clicking
|
||||
const castButton = document.getElementById('cast-button');
|
||||
if (castButton) {
|
||||
castButton.disabled = true;
|
||||
}
|
||||
|
||||
// Check if spell is correctly formed
|
||||
const expectedSentence = this._selectedSpell.english;
|
||||
const playerSentence = this._buildSentenceFromWords(this._selectedWords);
|
||||
@ -1574,14 +1580,19 @@ class WizardSpellCaster extends Module {
|
||||
return;
|
||||
}
|
||||
|
||||
// Generate new spells for next round
|
||||
// Generate new spells for next round (button will be re-enabled in _generateNewSpells)
|
||||
setTimeout(() => {
|
||||
this._generateNewSpells();
|
||||
this._spellStartTime = Date.now();
|
||||
}, 1000);
|
||||
} else {
|
||||
// Spell failed!
|
||||
// Spell failed! Re-enable button after fail animation
|
||||
this._showFailEffect();
|
||||
setTimeout(() => {
|
||||
if (castButton) {
|
||||
castButton.disabled = false;
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2562,7 +2573,7 @@ class WizardSpellCaster extends Module {
|
||||
});
|
||||
|
||||
victoryScreen.querySelector('#exit-victory-btn').addEventListener('click', () => {
|
||||
this._eventBus.emit('navigation:navigate', { path: '/games' }, 'Bootstrap');
|
||||
window.app.getCore().router.navigate('/games');
|
||||
});
|
||||
|
||||
// Emit victory event
|
||||
@ -2602,7 +2613,7 @@ class WizardSpellCaster extends Module {
|
||||
});
|
||||
|
||||
defeatScreen.querySelector('#exit-defeat-btn').addEventListener('click', () => {
|
||||
this._eventBus.emit('navigation:navigate', { path: '/games' }, 'Bootstrap');
|
||||
window.app.getCore().router.navigate('/games');
|
||||
});
|
||||
|
||||
// Emit defeat event
|
||||
|
||||
Loading…
Reference in New Issue
Block a user