Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Master Godot 4 GDScript patterns including signals, scenes, state machines, and optimization. Use when building Godot games, implementing game systems, or learning GDScript best practices.
.claude/skills/itamarzand88-godot-gdscript-patterns/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 104% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 83% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 10% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 105% | 0% |
<!-- source: wshobson-godot-gdscript-patterns — https://raw.githubusercontent.com/wshobson/agents/main/plugins/game-development/skills/godot-gdscript-patterns/SKILL.md -->
Production patterns for Godot 4.x game development with GDScript, covering architecture, signals, scenes, and optimization.
Node: Base building block
├── Scene: Reusable node tree (saved as .tscn)
├── Resource: Data container (saved as .tres)
├── Signal: Event communication
└── Group: Node categorizationgdscriptclass_name Player extends CharacterBody2D # Signals signal health_changed(new_health: int) signal died # Exports (Inspector-editable) @export var speed: float = 200.0 @export var max_health: int = 100 @export_range(0, 1) var damage_reduction: float = 0.0 @export_group("Combat") @export var attack_damage: int = 10 @export var attack_cooldown: float = 0.5 # Onready (initialized when ready) @onready var sprite: Sprite2D = $Sprite2D @onready var animation: AnimationPlayer = $AnimationPlayer @onready var hitbox: Area2D = $Hitbox # Private variables (convention: underscore prefix) var _health: int var _can_attack: bool = true func _ready() -> void: _health = max_health func _physics_process(delta: float) -> void: var direction := Input.get_vector("left", "right", "up", "down") velocity = direction * speed move_and_slide() func take_damage(amount: int) -> void: var actual_damage := int(amount * (1.0 - damage_reduction)) _health = max(_health - actual_damage, 0) health_changed.emit(_health) if _health <= 0: died.emit()
Detailed pattern documentation lives in references/details.md. Read that file when the navigation tier above is insufficient.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | pass→pass | 2,752 | 2,888 | +5% | 1 | 1 | 0% | 548 | 1,117 | +104% | 0 | 0 | — |
case-01 | fail→fail | 7,314 | 5,950 | -19% | 1 | 1 | 0% | 1,622 | 1,988 | +23% | 0 | 0 | — |
case-02 | fail→fail | 8,886 | 6,702 | -25% | 1 | 1 | 0% | 1,928 | 1,973 | +2% | 0 | 0 | — |
case-03 | pass→pass | 2,550 | 1,900 | -25% | 1 | 1 | 0% | 508 | 932 | +83% | 0 | 0 | — |
case-04 | pass→pass | 5,886 | 3,583 | -39% | 1 | 1 | 0% | 1,139 | 1,257 | +10% | 0 | 0 | — |
case-05 | pass→pass | 2,026 | 1,416 | -30% | 1 | 1 | 0% | 394 | 806 | +105% | 0 | 0 | — |
case-07 | pass→pass | 3,635 | 3,089 | -15% | 1 | 1 | 0% | 801 | 1,165 | +45% | 0 | 0 | — |
case-08 | pass→pass | 3,679 | 2,565 | -30% | 1 | 1 | 0% | 739 | 1,111 | +50% | 0 | 0 | — |
case-09 | pass→pass | 3,497 | 1,477 | -58% | 1 | 1 | 0% | 578 | 824 | +43% | 0 | 0 | — |
case-10 | pass→pass | 1,533 | 1,368 | -11% | 1 | 1 | 0% | 284 | 782 | +175% | 0 | 0 | — |
case-15 | pass→pass | 2,717 | 2,388 | -12% | 1 | 1 | 0% | 502 | 988 | +97% | 0 | 0 | — |
case-11 | fail→pass | 3,639 | 2,634 | -28% | 1 | 1 | 0% | 782 | 1,027 | +31% | 0 | 0 | — |
case-12 | pass→pass | 2,327 | 1,850 | -20% | 1 | 1 | 0% | 388 | 912 | +135% | 0 | 0 | — |
case-13 | pass→pass | 4,866 | 2,983 | -39% | 1 | 1 | 0% | 1,035 | 1,185 | +14% | 0 | 0 | — |
case-14 | pass→pass | 1,453 | 1,316 | -9% | 1 | 1 | 0% | 259 | 833 | +222% | 0 | 0 | — |
case-16 | pass→pass | 4,525 | 4,100 | -9% | 1 | 1 | 0% | 1,012 | 1,477 | +46% | 0 | 0 | — |
case-17 | pass→pass | 3,072 | 1,250 | -59% | 1 | 1 | 0% | 584 | 804 | +38% | 0 | 0 | — |
case-18 | pass→pass | 5,035 | 3,537 | -30% | 1 | 1 | 0% | 1,187 | 1,392 | +17% | 0 | 0 | — |
case-19 | pass→pass | 7,462 | 3,460 | -54% | 1 | 1 | 0% | 1,658 | 1,311 | -21% | 0 | 0 | — |
case-20 | pass→pass | 5,419 | 4,663 | -14% | 1 | 1 | 0% | 1,347 | 1,739 | +29% | 0 | 0 | — |
case-21 | pass→pass | 9,841 | 7,924 | -19% | 1 | 1 | 0% | 2,311 | 2,513 | +9% | 0 | 0 | — |
case-22 | pass→pass | 7,989 | 7,559 | -5% | 1 | 1 | 0% | 1,699 | 2,247 | +32% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.