惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
aimingoo的专栏
aimingoo的专栏
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
IT之家
IT之家
V
Visual Studio Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
A
About on SuperTechFans
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
A
Arctic Wolf
WordPress大学
WordPress大学
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
T
Threat Research - Cisco Blogs
Latest news
Latest news
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
J
Java Code Geeks
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
I
Intezer
L
LangChain Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
GRAHAM CLULEY
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Solstice Cipher: Routing Light to Crack Codes — A Puzzle Game for the June Solstice Game Jam
fanioz · 2026-06-20 · via DEV Community

fanioz

Solstice Chiper

This is a submission for the June Solstice Game Jam

What I Built

The June solstice is the moment the sun reaches its peak — the longest day, the shortest shadow. I wanted to build a game where you become the sun.

Solstice Cipher is an optical puzzle game where you manipulate light beams to decrypt hidden words. Each level gives you a sun emitter, a set of cipher glyphs hiding the letters of a secret word, and a briefcase full of optical tools. Your job: route the light beam through the correct sequence of glyphs to illuminate every letter and reveal the cipher.

The game progresses through 15 hand-crafted levels that track the arc of the solstice day. Early levels teach you the basics with a single mirror; by the end, you're juggling prisms that split beams, color filters that tint white light into red, green, or blue, combiners that additively blend two colored beams back together, portals that teleport light across the board, and benders that deflect beams at fixed 45° angles. Every tool snaps to 15-degree increments, turning freeform placement into a satisfying logic constraint.

The solstice connection isn't just thematic window dressing — it's the core mechanic. You literally control light, casting it through shadow to reveal hidden knowledge. The deeper you progress, the more tools you need, mirroring how the sun's journey across the sky grows more complex as the day unfolds.

You can play it right now — no downloads required:

Video Demo

Code

Solstice Cipher

A neon-lit optical puzzle game about manipulating light beams to decrypt hidden codes.
Built for the June Solstice Game Jam

Play on Vercel Godot 4.6 Platforms


About the Game

Solstice Cipher is a sci-fi optical puzzle game where you manipulate light beams to decrypt hidden codes. You are given a grid and a briefcase full of optical tools like mirrors and beam splitters. Your goal is to route a single light emitter through the correct sequence of receiver glyphs to reveal the hidden cipher.

It features a sleek, high-contrast neon aesthetic with strict orthogonal grids, capturing the feeling of classic "laser reflecting" games with modern polish and smooth animations.

Features

  • Optical Puzzles: Drag and drop tools like mirrors and splitters to direct light beams around obstacles.
  • Contextual Learning: Learn the mechanics naturally as you play, thanks to a contextual UI tutorial system that guides you without breaking immersion.
  • Neon Aesthetic: A sleek, high-contrast visual…

How I Built It

I didn't write a single line of GDScript by hand. Instead, I took on the role of Game Director, using Google Antigravity — a Gemini-powered autonomous coding agent — as my lead programmer and Godot engine specialist.

I chose Godot 4.6 with the GL Compatibility renderer (WebGL 2) to target both web browsers and Android. My process was entirely prompt-driven: I described architectural constraints and game mechanics in plain English, and Antigravity generated the implementation.

1. A Multi-Pass 2D Raycasting Engine

The heart of the game is a custom raycasting system built on Godot's PhysicsDirectSpaceState2D. Every time a tool is moved or rotated, the engine recalculates the entire light path from scratch:

var space_state = get_world_2d().direct_space_state

active_rays.append({
    "origin": sun.global_position,
    "direction": Vector2.RIGHT.rotated(sun.rotation),
    "color": "white",
    "bounces_left": MAX_BOUNCES,
    "exclude": [],
    "current_dist": 0.0
})

Each ray segment is cast using PhysicsRayQueryParameters2D, and when the beam hits a tool, the tool's process_beam() method returns zero, one, or two new rays depending on its type. Mirrors use Vector2.bounce() for physically accurate reflections. Prisms split a single beam into two — one straight-through and one at a right angle. The whole system runs in a propagation queue that resolves in multiple passes (up to 10) to handle combiners that need to accumulate inputs from separate beam branches before emitting their blended output:

while active_rays.size() > 0 and pass_count < 10:
    var propagation_queue = active_rays.duplicate()
    active_rays.clear()

    while propagation_queue.size() > 0:
        var ray = propagation_queue.pop_front()
        _cast_ray_segment(space_state, ray, propagation_queue)

2. Seven Optical Tools, One Unified Interface

Every tool implements a single polymorphic process_beam() method. The raycaster doesn't care what it hit — it just calls process_beam() and follows the output. This made it trivial to add new tool types without touching the core engine:

Tool Behavior
Mirror Reflects the beam (Vector2.bounce())
Prism Splits into straight-through + right-angle beams
Filter Passes beam through, tinting it red/green/blue
Combiner Collects two colored beams, additively blends RGB, emits one output
Portal Teleports beam to a linked portal with local-space direction inversion
Bender Deflects beam at a fixed 45° angle relative to its normal
Shade Blocks the beam entirely

3. Color-Matched Cipher Glyphs

The real "aha!" moment in puzzle design came from coupling color to the cipher. Each glyph has a required_color property — if the beam hitting it doesn't match, it stays dark:

func set_illuminated(state: bool, hit_color: String = "white") -> void:
    if state and hit_color != required_color:
        state = false

This means later levels aren't just about routing light to the right place — you need the right color of light to arrive there. You might need to split a white beam through a prism, filter one branch to red and the other to blue, then recombine them downstream for a magenta glyph. It transforms each puzzle into a logic circuit.

4. Contextual Tutorial Without Breaking Flow

With the jam clock ticking, I couldn't afford to build scripted tutorial levels. Instead, I implemented a lightweight contextual UI system that teaches mechanics as the player discovers them:

func _on_item_dropped(tool_type: String, drop_position: Vector2, _slot_ref: Node) -> void:
    if instruction_1:
        instruction_1.hide()
    if tool_type == "mirror" and instruction_3 and not instruction_3.visible:
        instruction_3.show()
        instruction_3.position = drop_position + Vector2(-300, -80)

The instructions only appear after the player successfully performs an action. Drop your first mirror? Now the rotation hint appears — positioned right above where you dropped it. It's reactive, not prescriptive.

5. Procedural Puzzle Verification with a BFS Backwards Solver

To validate that generated puzzle layouts are actually solvable, I tasked Antigravity with building a BackwardsSolver. It uses BFS pathfinding on the grid to find routes from the light source to each glyph, then analyzes turns and intersections to determine exactly which tools (mirrors, prisms, filters) need to be placed and where. If the required tool count exceeds the tier's budget, the layout is rejected:

# Budget check
if tools.size() > get_piece_budget(tier):
    return {} # Over budget — reject and regenerate

This guarantees every procedurally generated level is mathematically solvable before the player ever sees it.

Prize Category

Best Ode to Alan Turing

Solstice Cipher is, at its core, a game about mechanical decryption.

Just as Turing's Bombe machine required operators to wire together rotors in precise configurations to complete an electrical circuit and crack Enigma, players in Solstice Cipher must wire together optical tools in precise configurations to complete a light circuit and crack a hidden word. The parallel is structural, not superficial:

  • Turing's rotor → the Mirror. Both redirect a signal (electrical/optical) along a new path.
  • The plugboard → the Filter and Combiner. Both transform the signal's properties (letter substitution / color transformation) as it passes through.
  • The Enigma ciphertext → the darkened glyphs. Both are meaningless until the correct circuit configuration illuminates the answer.

The game's multi-pass raycasting engine effectively makes each puzzle chamber a programmable optical computer. The player doesn't just solve puzzles — they physically program a decryption machine out of light and glass, one mirror at a time. Every valid solution is a working program; every incorrect configuration is a bug.

Best Google AI Usage

Solstice Cipher was built from the ground up using Google Antigravity, a Gemini-powered autonomous coding agent, acting as my lead programmer and Godot 4.6 specialist. My role was pure game direction — defining architecture constraints, reviewing generated code, and steering design decisions.

Antigravity co-developed every technical system in the project:

  • The multi-pass 2D raycasting engine with PhysicsDirectSpaceState2D, including the propagation queue and combiner resolution loop
  • All seven optical tool implementations with their polymorphic process_beam() interfaces
  • The BFS backwards solver for procedural puzzle validation with tier-based budget constraints
  • The contextual tutorial system with tween-driven breathing animations
  • The CipherUI system that connects glyph illumination signals to the win condition checker
  • The SaveManager, AudioManager (with SFX pooling), and TransitionManager autoloads
  • A complete GUT test suite validating the scaffolder's determinism and the solver's correctness

This project demonstrates Google AI not as an embedded runtime feature, but as a full-spectrum game development partner — from architecture to implementation to testing.


Discussion: What's your approach to teaching players new mechanics during a jam? Scripted tutorials, contextual hints, or something else entirely? Let me know below!