GDScripter
Learn GDScript like a game โ then build one.
Mini-games. Flashcards. Sarcastic XP. Hit Level 2 and unlock a platformer + ping pong vs computer tutorial.
Yes, the computer paddle will be better than you at first. That's the curriculum.
Lane map
Pick a lane. Watch it light up.
Not a menu of identical cards โ a live fork in the road. Hover a node, claim a path, earn XP. Boss builds open at Level 2 ยท you're Lv 1, 100 XP left.
Pro move: pick one glowing lane, then come back for the boss door.
Foundations
Brand new or transferring in
Focus lanes
One concept, drilled hard
Hands-on chaos
Code, timers, no mercy
Boss builds
Unlock at Level 2
How it works
Short sessions. Instant feedback. Optional emotional damage.
Pick your starting lane
Beginner? Signals? Chaos quiz? You choose. No forced campaign โ just ego and XP.
Play + cards until Level 2
100 XP unlocks Build tutorials. The site will roast you until you get there.
Ship a tiny game
Platformer and Ping Pong vs AI โ real Godot 4 steps, not vibes-only theory.
Modes
Everything awards XP. Level 2 is the boss door.
Flowchart: syntax โ vectors โ 2D โ 3D
Open roadmap โLabCode a sprite to walk โ levels + hints
Enter lab โPlay24 bugs ยท 22 matches ยท 24 fills
Open games โCards62 cards โ filter any topic
Flip now โBuildPlatformer + Pong vs AI after Level 2
View builds โContributeShip cards, fixes, and your first PR
Learn how โCurriculum
What you'll learn
From integers to 3D movement โ tap a topic to jump into the path docs.
- 01Variables & typesvar, const, typing, enums, strings
- 02Functions & lifecycle_ready, _process, physics step, returns
- 03Signals & awaitconnect, emit, timers, animation waits
- 04Nodes & scenes$ paths, @onready, groups, instantiate
- 05Data & control flowArrays, Dictionaries, match, loops
- 06Movement & 3Ddelta, CharacterBody2D/3D, Input Map
A pattern you'll meet in Lab, Play, and Build:
extends CharacterBody2D
@export var speed := 220.0
signal died
func _physics_process(delta):
var dir = Input.get_vector(
"ui_left", "ui_right",
"ui_up", "ui_down"
)
velocity = dir * speed
move_and_slide()
func take_hit(amount: int) -> void:
health -= amount
if health <= 0:
died.emit()
queue_free()