
Godot Genre Educational
- 151 installs
- 454 repo stars
- Updated July 28, 2026
- thedivergentai/gd-agentic-skills
Use godot-genre-educational for development tasks
About
godot-genre-educational: A skill for development. This provides functionality for development workflows.
- godot-genre-educational
Godot Genre Educational by the numbers
- 151 all-time installs (skills.sh)
- +15 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #2,506 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/thedivergentai/gd-agentic-skills --skill godot-genre-educationalAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 151 |
|---|---|
| repo stars | ★ 454 |
| Last updated | July 28, 2026 |
| Repository | thedivergentai/gd-agentic-skills ↗ |
What it does
Use godot-genre-educational for development tasks
Files
Genre: Educational / Gamification
Expert blueprint for educational games that make learning engaging through game mechanics.
NEVER Do (Expert Anti-Patterns)
Pedagogy & Flow
- NEVER punish failure with a "Game Over"; strictly use "Try Again" or Contextual Hints to ensure a safe, encouraging learning environment.
- NEVER separate learning from gameplay ("Chocolate-covered broccoli"); strictly ensure the mechanic IS the learning (e.g., math-based trajectory calc).
- NEVER use walls of text for instructions; strictly use Show, Don't Tell methods: interactive diagrams, non-verbal tutorials, or 3-second looping GIFs.
- NEVER skip Spaced Repetition logic; strictly ensure successfully answered questions reappear at increasing intervals to verify long-term retention.
- NEVER focus on failure; strictly prominently display Mastery %, XP Bars, and Skill Trees to motivate through visible progress.
- NEVER assume a fixed difficulty; strictly implement Dynamic Scaffolding that adjusts challenge based on the student's mastery level to keep them in the "Zone of Proximal Development".
- NEVER hardcode student stats in UI components; strictly use `Resource` scripts (`StudentProfile`) to decouple student data from the presentation layer for persistence and scalability.
- NEVER build custom debug dashboards for performance tracking during development; strictly use `Performance.add_custom_monitor()` to inject live student metrics into the Godot Editor Debugger.
Technical & Accessibility
- NEVER hardcode text into UI; strictly use Translation Keys (PO files) for internationalization and classroom localized support.
- NEVER force TTS without user consent; strictly provide an in-game toggle and respect OS-level screen reader settings.
- NEVER use absolute pixel positioning; strictly use the Anchoring & Container system for responsive scaling across tablets and classroom laptops.
- NEVER perform heavy data grading on the main thread; strictly use WorkerThreadPool to prevent UI freezes during automated assessments.
- NEVER forget to handle IME updates; strictly monitor
NOTIFICATION_OS_IME_UPDATEfor complex character input support (e.g., East Asian). - NEVER ignore
mouse_filteron overlays; strictly set toPASSto prevent invisible containers from silently consuming clicks. - NEVER update static strings in
_process(); strictly update labels ONLY on state change events to save mobile/tablet battery. - NEVER embed sensitive database credentials in exports; strictly use Environment Variables or proxy APIs for student data security.
---
🛠 Expert Components (scripts/)
MANDATORY: Read the appropriate script before implementing the corresponding pattern.
Original Expert Patterns
- adaptive_difficulty_adjuster.gd - Sophisticated logic engine for Flow-State targeting (70%) and progressive hints.
Modular Components
- tts_manager.gd - displayServer Text-to-Speech integration for accessibility.
- dynamic_localization.gd - Runtime localization switching and pluralization support.
- interactive_rich_text.gd - Meta-click handling for interactive glossaries.
- threaded_scoring_engine.gd - WorkerThreadPool patterns for grading algorithms.
---
Core Loop
1. Learn: Player receives new information (text, diagram, video). 2. Apply: Player solves a problem or completes a task using that info. 3. Feedback: Game provides immediate correction or reward. 4. Adapt: System adjusts future questions based on performance. 5. Master: Player unlocks new topics or cosmetic rewards.
Skill Chain
| Phase | Skills | Purpose |
|---|---|---|
| 1. UI | godot-ui-rich-text, godot-ui-theming | Readable text, drag-and-drop answers |
| 2. Data | godot-save-load-systems, json-serialization | Student profiles, progress tracking |
| 3. Logic | state-machine | Quiz flow (Question -> Answer -> Result) |
| 4. Juice | godot-particles, godot-tweening | Making learning feel rewarding |
| 5. Meta | godot-scene-management | Navigating between lessons and map |
Architecture Overview
1. The Curtain (Question Manager)
Manages the flow of a single "Lesson" or "Quiz".
# quiz_manager.gd
extends Node
var current_question: QuestionData
var correct_streak: int = 0
func submit_answer(answer_index: int) -> void:
if current_question.is_correct(answer_index):
handle_success()
else:
handle_failure()
func handle_success() -> void:
correct_streak += 1
EffectManager.play_confetti()
StudentProfile.add_xp(current_question.topic, 10)
load_next_question()
func handle_failure() -> void:
correct_streak = 0
# Spaced Repetition: Add this question back to the queue
question_queue.push_back(current_question)
show_explanation()2. The Student Profile
Persistent data tracking mastery.
# student_profile.gd
class_name StudentProfile extends Resource
@export var topic_mastery: Dictionary = {} # "math_add": 0.5 (50%)
@export var total_xp: int = 0
@export var badges: Array[String] = []
func get_mastery(topic: String) -> float:
return topic_mastery.get(topic, 0.0)3. Curriculum Tree
Defining the dependency graph of knowledge.
# curriculum_node.gd
extends Resource
@export var id: String
@export var title: String
@export var required_topics: Array[String] # Prereqs4. Mastery-Based Matchmaking (Profiles)
Use custom Resources for student profiles to track and react to mastery changes.
# student_profile.gd (Resource)
class_name StudentProfile extends Resource
signal mastery_up(new_tier: int)
@export var score: int = 0:
set(v):
score = v
if score > threshold: _promote()
func _promote():
tier += 1
mastery_up.emit(tier)5. Visual Analytics (Custom Monitors)
Inject metrics into the Godot Editor Debugger without building complex UI.
# analytics_manager.gd (Autoload)
func _ready():
if not Engine.is_editor_hint():
Performance.add_custom_monitor("edu/correct_rate", _get_rate)
func _get_rate():
return float(correct) / total_attempts6. Hint-Cooldown (Progressive Disclosure)
Decouple time-based hint reveals using signals.
# hint_manager.gd
signal hint_revealed(text: String)
var _timer: float = 0.0
func _process(delta):
_timer += delta
if _timer >= cooldown:
hint_revealed.emit(hints.pop_front())
_timer = 0.0Key Mechanics Implementation
Adaptive Difficulty algorithm
If player is crushing it, give harder questions. If struggling, ease up.
func get_next_question() -> QuestionData:
var player_rating = StudentProfile.get_rating(current_topic)
# Target a 70% success rate for "Flow State"
var target_difficulty = player_rating + 0.1
return QuestionBank.find_question(target_difficulty)Juice (The "Duolingo Effect")
Learning is hard. The game must heavily reward effort visually.
- Sound: Satisfying "Ding!" on correct.
- Visuals: Screen shake, godot-particles, multiplier popup.
- UI: Progress bars filling up smoothly (Tweening).
Godot-Specific Tips
- RichTextLabel: Essential for mathematical formulas or coloring keywords (BBCode).
- Drag and Drop: Godot's Control nodes have built-in
_get_drag_dataand_drop_datamethods. Perfect for "Match the items" puzzles. - Localization: Educational games often need to support multiple languages. Use Godot's
TranslationServerfrom day one.
Common Pitfalls
1. Chocolate-Covered Broccoli: Game loop and Learning loop are separate. Fix: Make the mechanic be the learning (e.g., Typing of the Dead). 2. Punishing Failure: Player gets "Game Over" for being wrong. Fix: Never fail state. Just "Try Again" or "Here's a hint". 3. Wall of Text: Too much reading. Fix: Interaction first. Show, don't tell.
Reference
- Master Skill: godot-master
# skills/genre-educational/code/adaptive_difficulty_adjuster.gd
extends Node
## Adaptive Difficulty Adjuster Expert Pattern
## Features Success-Ratio Tracking and Branching Hint Logic.
signal difficulty_changed(level: int)
signal hint_suggested(hint_text: String)
@export var window_size: int = 5 # Track last 5 attempts
@export var up_threshold: float = 0.8 # Move up if > 80% success
@export var down_threshold: float = 0.4 # Move down if < 40% success
var _recent_results: Array[bool] = []
var _current_difficulty_level: int = 1
func log_result(is_correct: bool) -> void:
_recent_results.append(is_correct)
if _recent_results.size() > window_size:
_recent_results.remove_at(0)
_evaluate_difficulty()
if not is_correct:
_provide_contextual_hint()
func _evaluate_difficulty() -> void:
if _recent_results.size() < window_size: return
var correct_count = _recent_results.count(true)
var ratio = float(correct_count) / window_size
if ratio >= up_threshold:
_current_difficulty_level += 1
difficulty_changed.emit(_current_difficulty_level)
_recent_results.clear() # Reset window after shift
elif ratio <= down_threshold:
_current_difficulty_level = max(1, _current_difficulty_level - 1)
difficulty_changed.emit(_current_difficulty_level)
_recent_results.clear()
func _provide_contextual_hint() -> void:
# 1. Branching Hint Logic
# Professionals provide progressive disclosure:
# Small nudge -> Tooltip -> Full explanation.
var consecutive_fails = 0
for i in range(_recent_results.size() -1, -1, -1):
if not _recent_results[i]: consecutive_fails += 1
else: break
match consecutive_fails:
1: hint_suggested.emit("Focus on the highlighted area.")
2: hint_suggested.emit("Remember: Addition happens before multiplication in this step.")
3: hint_suggested.emit("Let's review the PEMDAS tutorial together.")
## EXPERT NOTE:
## Store '_current_difficulty_level' in a 'StudentProfile' Resource
## to maintain a tailored experience across sessions.
# adaptive_ui_anchors.gd
# Managing UI scaling across different screen factors
extends Control
# EXPERT NOTE: Anchoring is essential for educational apps
# that must run on tablets (Landscape) and phones (Portrait).
func _ready():
# Programmatic anchoring for dynamic UI generation
anchor_left = 0.5
anchor_right = 0.5
offset_left = -200
offset_right = 200 # Centered 400px panel
grow_horizontal = GROW_DIRECTION_BOTH
# assessment_pause_handler.gd
# Halting simulations during quiz interactions
extends Node
# EXPERT NOTE: get_tree().paused is the efficient way
# to freeze the world logic while keeping the UI interactive.
func open_assessment():
get_tree().paused = true
# Animation/Tweening the UI overlay in
_show_quiz()
func close_assessment():
get_tree().paused = false
_hide_quiz()
func _show_quiz(): pass
func _hide_quiz(): pass
# dynamic_localization.gd
# Transitioning between languages at runtime using tr()
extends Node
# EXPERT NOTE: tr() and atr() allow for dynamic localization
# without restarting the application.
func update_language(locale: String):
TranslationServer.set_locale(locale)
_refresh_ui_text()
func _refresh_ui_text():
# Example for a button tag
# get_node("StartButton").text = tr("KEY_START")
pass
func get_apples_text(count: int) -> String:
# EXPERT: Pluralization support via TranslationServer
return atr_n("APPLE_COUNT_ONE", "APPLE_COUNT_MANY", count)
# focus_navigation_manager.gd
# Enabling keyboard/gamepad-only menu navigation
extends Node
# EXPERT NOTE: Ensuring focus management is vital
# for accessibility and keyboard-only classroom environments.
func set_initial_focus(container: Control):
var first_btn = container.find_next_valid_focus()
if first_btn:
first_btn.grab_focus()
func _input(event):
if event.is_action_pressed("ui_cancel"):
# Escape key behavior for menu exits
pass
# interactive_rich_text.gd
# Handling hyperlink clicks in educational content
extends RichTextLabel
# EXPERT NOTE: RichTextLabel meta_clicked signal allows for
# interactive glossaries or pop-up definitions within text.
func _on_meta_clicked(meta):
# meta can be a URL or a custom string tag
if str(meta).begins_with("glossary:"):
_show_definition(str(meta).split(":")[1])
func _show_definition(_term):
# Display popup logic here
pass
# low_processor_optimizer.gd
# Reducing CPU usage for stationary educational screens
extends Node
# EXPERT NOTE: Enabling low_processor_mode saves battery on
# student laptops during non-animated quiz sections.
func toggle_optimization(enable: bool):
OS.low_processor_usage_mode = enable
# Set max sleep if enabled to further reduce draw frequency
if enable:
OS.low_processor_usage_mode_sleep_usec = 6900 # ~144hz limit
# student_progress_config.gd
# Saving progress to human-readable ConfigFiles
extends Node
# EXPERT NOTE: ConfigFile is safer than JSON for educational settings
# as it allows for structured sections and easier recovery.
var config = ConfigFile.new()
const SAVE_PATH = "user://student_profile.cfg"
func save_progress(level_id: String, score: int):
config.load(SAVE_PATH)
config.set_value("Progress", level_id, score)
config.save(SAVE_PATH)
func get_score(level_id: String) -> int:
config.load(SAVE_PATH)
return config.get_value("Progress", level_id, 0)
# text_reveal_effect.gd
# Custom RichTextEffect for engaging content reveals
@tool
extends RichTextEffect
class_name RichTextWobble
# EXPERT NOTE: Custom effects allow for 'game-ifying'
# educational text reading for younger users.
var bbcode = "wobble"
func _process_custom_fx(char_fx):
var speed = char_fx.env.get("speed", 5.0)
var freq = char_fx.env.get("freq", 2.0)
char_fx.offset.y += sin(char_fx.elapsed_time * speed + char_fx.relative_index * freq) * 2.0
return true
# threaded_scoring_engine.gd
# Running assessment algorithms without lagging the UI
extends Node
# EXPERT NOTE: WorkerThreadPool keeps the application responsive
# during heavy data grading or report generation.
func start_grading(data: Dictionary):
WorkerThreadPool.add_task(_grade_data.bind(data))
func _grade_data(data: Dictionary):
# Complex grading algorithm logic...
print("Grading complete for ", data.get("student_id"))
# tts_manager.gd
# Utilizing Godot's built-in Text-to-Speech for accessibility
extends Node
# EXPERT NOTE: DisplayServer.tts_spoke() provides native
# OS-level accessibility support for visually impaired students.
func speak_question(text: String):
var voices = DisplayServer.tts_get_voices_for_language("en")
if !voices.is_empty():
DisplayServer.tts_speak(text, voices[0])
func stop_speech():
DisplayServer.tts_stop()