cd ../portfolio
Phase 1 // Godot Engine

DreamBlaster

A dream-themed shooter built in Godot. Surreal environments, procedurally generated levels, and particle effects that blur the line between waking and sleeping. Where game physics learned to bend.

Created May 20, 2025 Size 89 MB Lang GDScript 100% Stars 1

Project Overview

DreamBlaster is a surreal shooter where dreamscapes shift and morph as you play. Built in Godot with procedural level generation, it pushed into territory COLORWAR never touched: runtime randomness, layered particle systems, and physics that deliberately break the rules. The dream theme was an excuse to experiment freely -- if something looked wrong, it was "intentional."

89 MB
Project Size (particles + assets)
100%
GDScript
Proc
Procedural Generation
1 ★
GitHub Star

Technology

Same engine as COLORWAR, but deeper. Heavy use of GPUParticles2D, shader materials, and procedural room generation with random seeds.

GDScript Godot 4.x GPUParticles2D ShaderMaterial RandomNumberGenerator RigidBody2D Tween VisualShader

Procedural Architecture

The dream world is generated at runtime. Room templates are shuffled and connected via doorway nodes, with enemy spawns and visual themes selected per-room.

DreamBlaster/ scenes/ player/ DreamWalker.tscn # Player with dream powers dream_gun.gd # Projectile with trail FX generation/ RoomGenerator.gd # Procedural room placement RoomTemplates/ # 12+ room prefabs DoorwayLinker.gd # Connects rooms at exits enemies/ NightmareSpawner.gd # Wave-based enemy spawns ShadowCreature.tscn # Phase-shifting enemy fx/ DreamParticles.tscn # Ambient floating particles NightmareShader.gdshader # Distortion post-process shaders/ dream_dissolve.gdshader # Room transition effect chromatic_aberration.gdshader

Key Features

🌌
Procedural Dreamscapes
Every run generates a unique layout from room templates. No two dreams are the same.
Layered Particle Systems
Multiple GPUParticles2D layers create depth: ambient dust, combat sparks, dream fog.
💨
Shader Effects
Chromatic aberration, dream dissolve transitions, and distortion when "reality" weakens.
👻
Nightmare Enemies
Enemies that phase through walls, split on death, and adapt to your playstyle.
🎲
Physics Bending
Gravity shifts, projectiles that curve, and areas where the laws of motion change.
🎨
Surreal Aesthetics
Intentionally glitchy visuals. Colors bleed, geometry warps, backgrounds breathe.

Code Snapshot

The procedural room generator -- places rooms using a random walk algorithm and links their doorways.

RoomGenerator.gd
extends Node2D

@export var room_templates: Array[PackedScene]
@export var max_rooms: int = 12
@export var room_spacing: float = 512.0

var rng = RandomNumberGenerator.new()
var placed_rooms: Array = []

func generate_dream(seed_val: int):
    rng.seed = seed_val
    var cursor = Vector2.ZERO

    for i in max_rooms:
        var template = room_templates[rng.randi_range(0, room_templates.size() - 1)]
        var room = template.instantiate()
        room.position = cursor
        add_child(room)
        placed_rooms.append(room)

        # Random walk to next position
        var dir = [Vector2.RIGHT, Vector2.DOWN,
                   Vector2.LEFT, Vector2.UP]
        cursor += dir[rng.randi_range(0, 3)] * room_spacing

    link_doorways()

Development Timeline

May 20, 2025
Project Created
11 days after COLORWAR. Applied lessons from first project immediately.
Week 1
Procedural Generation Core
Room templates, random walk placement, doorway linking system.
Week 2
Visual Effects Pipeline
First shaders written. GPUParticles2D for ambient dream atmosphere.
Week 3
Enemy AI & Polish
Phase-shifting enemies, wave spawner, post-processing stack.

What This Project Taught

01

Procedural Generation is Addictive

Once rooms started connecting randomly, every run felt different. The random walk algorithm was simple but the emergent layouts were complex. Seed-based generation meant interesting layouts could be saved and shared.

02

Particles Are Cheap, Impact Is Expensive

Adding particles is easy. Making them feel right takes iteration. Every effect needed tuning: lifetime, emission rate, gravity, color curves. The "dream fog" went through 15 versions before it felt ethereal instead of laggy.

03

Shaders Open a New Dimension

Writing the first shader was terrifying. Fragment functions, UV coordinates, uniforms. But once chromatic aberration worked, every visual problem looked like a shader problem. The dream dissolve transition was the proudest moment.

04

Theme Covers a Multitude of Bugs

When enemies clip through walls in a normal game, it is a bug. In a dream game, it is "reality breaking down." The surreal theme was a genuine design advantage -- imperfection became aesthetic.