Defend your kingdom with arcane power. The king trusts you. Probably a mistake.
Real-time strategy · Tower defense
Court Wizard is a 2D/3D real-time strategy tower-ish defense game where you play as a powerful wizard defending your castle from relentless waves of attackers.
Cast devastating spells from your tower, support your defenders, and master the arcane arts to protect your king. Built entirely in Rust with the Bevy engine.
The king trusts you. Probably a mistake.
The studio
Court Wizard started as a hobby project — one developer learning Rust and game development from scratch. What began as a simple hobby with the Bevy engine grew into a potential business venture.
It is now the first title from Blackhearth Games, an indie studio born from the belief that a single developer with a little free time can build something the rest of the world might enjoy.
Made with passion for fantasy and magic.
GPL v3.0
Court Wizard is open source and licensed under GPL v3.0. The whole game is built in Rust, in the open.
Wishlist on Steam to follow along, or browse the source when it goes public.
No spells hidden behind closed doors.
This game was created by David Yurek.
This game is built using Bevy, a refreshingly simple data-driven game engine built in Rust.
This game is written in Rust, a language empowering everyone to build reliable and efficient software.
This project uses the following open-source libraries (via Cargo dependencies):
For complete license information, see the Cargo.lock file which lists all dependencies and their versions.
All character and unit sprites are from the Liberated Pixel Cup (LPC) project on OpenGameArt.org.
SPRITE_CREDITS.csv in the game directory for detailed per-file credits listing all contributing artists.Spell icons (assets/images/icons/) and static sprites (assets/images/static_sprites/) — including the menu backdrop, castle walls, and roulette wheel — were drawn by David Yurek for this project.
Music tracks are sourced from OpenGameArt.org and are licensed under CC-BY-SA 3.0. Tracks have been re-encoded/looped for use in this game.
Controller-button glyph fonts (Xbox, PlayStation, Steam Deck, Nintendo Switch) are by Kenney.
Sound effects are sourced from Pixabay.
This game is open source under the GNU General Public License v3.0. See LICENSE for details.
Draft — pending legal review.
Effective date: 2026-04-14 Last updated: 2026-04-14
Court Wizard is developed by Blackhearth Games. We do not operate any servers that collect your personal data. We do not use third-party analytics, advertising, or tracking services. All of your game data stays on your own computer, with the exception of anything you choose to share through Steam's platform features.
Court Wizard saves your progress and settings to a file on your own computer. This includes:
These files are stored in your operating system's standard application data directory:
%APPDATA%\court_wizard\~/.local/share/court_wizard/~/Library/Application Support/court_wizard/You can delete these files at any time to remove all locally stored data. Doing so will reset your progress.
If you play Court Wizard through Steam, your play session interacts with Valve's Steamworks APIs to support the following features:
This data is handled by Valve under Valve's own privacy policy, which is available at https://store.steampowered.com/privacy_agreement/. Blackhearth Games does not receive personally identifying information from Valve — we see only anonymous aggregate statistics.
Court Wizard's multiplayer mode uses peer-to-peer (P2P) networking over WebRTC. This means your game connects directly to another player's game without routing through a server operated by us.
A technical consequence of direct connections is that your IP address is visible to the player you are connected to, and theirs is visible to you. This is an inherent property of all peer-to-peer networking and is not something we collect, log, or store.
We do not operate a matchmaking server. Session data (moves, game state) is exchanged only between the two players and is not saved by us anywhere.
Court Wizard does not use Google Analytics, Facebook Pixel, crash reporters, advertising SDKs, or any other third-party telemetry services. The game does not phone home.
Court Wizard is not directed at children under 13. We do not knowingly collect personal information from children. Because we do not collect personal information from anyone, no special data-handling procedures for children are required.
Under the EU General Data Protection Regulation and the California Consumer Privacy Act, you have the right to:
Because all of your Court Wizard data is stored locally on your own computer, you can exercise all of these rights yourself by accessing, editing, or deleting the save files listed above. Blackhearth Games does not hold any copy of your personal data that you would need to contact us to retrieve or erase.
We may update this policy from time to time. The "Last updated" date above will reflect the most recent change. Material changes will be announced in the game's changelog and on the Court Wizard website.
If you have questions about this privacy policy, contact us at [email protected].
Draft — pending legal review. Please read before playing.
A very small number of people may experience a seizure when exposed to certain visual images, including flashing lights or patterns that may appear in video games. Even people who have no history of seizures or epilepsy may have an undiagnosed condition that can cause these "photosensitive epileptic seizures" while watching video games.
These seizures may have a variety of symptoms, including:
Stop playing immediately and consult a doctor if you or anyone else experiences any of these symptoms. Parents should watch for or ask their children about these symptoms — children and teenagers are more likely than adults to experience these seizures.
You can reduce the risk of photosensitive epileptic seizures by:
If you or any of your relatives have a history of seizures or epilepsy, consult a doctor before playing.
Court Wizard is a real-time strategy game with frequent bright particle effects and screen flashes during combat. Spells such as Chain Lightning, Meteor Fall, Wall of Fire, and Disintegrate produce rapid light effects. The Arcane Crystal and Black Hole spells produce large swirling visual patterns.
An optional CRT barrel distortion post-processing effect is enabled by default. If you experience motion discomfort, you can disable it from the Settings menu.
To reduce eye strain, muscular fatigue, and other discomfort:
If persistent pain or discomfort continues, consult a doctor.
Court Wizard is played primarily with a mouse. To avoid repetitive strain injuries:
If someone experiences a seizure, keep them safe by moving nearby objects away, do not restrain them, and seek medical help immediately.
Six reasons the king keeps you around.
Playstyles
From the Rune Caster to the Meteorologist, each archetype plays completely differently. Yes, one of them even uses poop magic. Unlock new wizards by earning achievements.
Arcane arsenal
9 talents per spell across 3 tiers. Build offense, control, support, and utility loadouts that match your wizard. The math is fine. Trust the wizard.
25 levels
25 levels, seeded runs, and difficulty sliders so you can dial the challenge to taste. Blame the RNG.
Survival
Infinitely scaling enemies. Infinitely scaling you. It gets ridiculous — that's the point.
Big threats
Ogre, Lich, Hags, and Dark Mage. They all want you dead. Specifically. Each demands a different plan.
Peer-to-peer PvP
Bring a friend. Destroy their kingdom instead. Peer-to-peer versus battles, wizard against wizard.
Online · Co-op
Connect to a fellow wizard and defend the kingdom together. Team up in both Endless and Roguelite modes — two wizards, one castle, twice the spells against the swarm.
Two wizards are better than one. Usually.
3 revealed. 8 locked. One of them definitely uses poop magic.
Revealed
Wizard · Starter
The reliable all-rounder. Straightforward spells, no gimmicks, no surprises — just solid arcane fundamentals to learn the ropes on.
Sometimes boring is best.
Wizard · Chaos
Embraces chaos. Your spells are drawn from the whims of fate — adaptable, unpredictable, and never the same run twice.
You don't choose the spell. The spell chooses you.
Wizard · Power
Master of mana flow. Reroute arcane energy on the fly to power up whatever the battlefield demands.
Geordi would be proud of your power routing.
Locked
Locked · Earn an achievement
This wizard has not been unlocked yet.
Something smells off…
Locked · Earn an achievement
This wizard has not been unlocked yet.
Spells? Where you're going, you don't need spells.
Locked · Earn an achievement
This wizard has not been unlocked yet.
Some wizards prefer a more… hands-on approach.
Locked · Earn an achievement
This wizard has not been unlocked yet.
The cauldron whispers to those who listen.
Locked · Earn an achievement
This wizard has not been unlocked yet.
The sky darkens. Something is brewing up there.
Locked · Earn an achievement
This wizard has not been unlocked yet.
Mysterious symbols. Mysterious results.
Locked · Earn an achievement
This wizard has not been unlocked yet.
Violence is never the answer… right?
Locked · Earn an achievement
This wizard has not been unlocked yet.
Some people just want to watch the world burn.
Click a screenshot for a caption.
GameplayCasting spells from the tower as waves close in on the castle.
BrewingMix ingredients dropped by enemies in the cauldron between the chaos.
The StudyResearch new spells and spend your Arcane Insight at the Wizard's Tower.
Battlefield ChaosWhen the spells and the swarm collide, the screen earns its name.
Ogre BossOne of the bosses that wants you dead. Specifically.
Roguelite RunSeeded runs across 25 levels with difficulty sliders to taste.
How to play Court Wizard. Click a topic to expand it.
You are the Court Wizard. Defend the castle from waves of incoming enemies by casting spells. Keep the king alive and eliminate all attackers to advance. Each wave brings more and stronger enemies.
You stand atop your tower with the full arcane arsenal at your disposal — but mana is finite, enemies are many, and the king is a bit of a worrier. Choose spells carefully, time your casts, and brew a potion or two between the chaos.
Press Escape or click the spell button in the top-left to open the spell book. Spells are organized into four categories: Offense, Control, Support, and Utility. Click a spell to see its description, then Select to prime it. You can also assign spells to action bar slots (1–5) from here.
The action bar at the bottom-left shows your 5 quick-cast slots. Press 1–5 anytime to instantly prime that spell. To assign a spell, open the spell book and press a number key while hovering over it.
Different spells have different casting styles:
Concentration spells remain active until you end them. While concentrating, the spell's mana cost is reserved — your mana won't regenerate past the reserved amount. You can concentrate on multiple spells at once, but each one reserves more mana. Click the cancel buttons on the right side of the screen to end individual concentration spells and free up mana.
The cauldron lets you brew potions from ingredients dropped by defeated enemies. Click the cauldron icon to open the brewing menu, toggle ingredients on or off, preview the effects, and click Brew. Your wizard can't cast while brewing, and mixing multiple ingredients dilutes each effect — choose carefully.
Defeating enemies earns Arcane Insight, which you spend at the Wizard's Tower to research new spells. Spells are organized in research chains — unlock earlier spells to access more powerful ones. Some spells require a minimum number of total spells researched.
Different wizard types offer unique playstyles. Three are available to start — Boring Ole Mage, Randomancer, and Arcanorouter — and eight more remain locked until you earn their achievements. See the Wizards tab for the full roster.
Every version, newest first. Click a version for its notes.
2026-06-18
2026-06-18
2026-06-17
2026-06-15
2026-06-15
2026-06-15
2026-06-13
2026-06-13
2026-06-12
2026-06-10
2026-06-04
2026-06-04
2026-06-02
2026-06-01
2026-06-01
2026-06-01
2026-05-30
2026-05-29
2026-05-28
2026-05-28
2026-05-26
2026-05-10
2026-05-08
2026-05-07
2026-05-05
2026-05-05
2026-05-04
2026-05-04
2026-05-03
2026-04-30
2026-04-30
2026-04-29
2026-04-29
2026-04-29
2026-04-28
2026-04-28
2026-04-28
2026-04-27
2026-04-27
2026-04-27
2026-04-27
2026-04-24
2026-04-23
2026-04-17
2026-04-17
2026-04-17
2026-04-15
2026-04-15
2026-04-14
2026-04-14
2026-04-14
2026-04-13
2026-04-13
2026-04-13
2026-04-12
2026-04-12
2026-04-11
2026-04-11
2026-04-11
2026-04-11
2026-04-10
2026-04-10
2026-04-10
2026-04-09
2026-04-09
2026-04-08
2026-04-07
2026-04-07
2026-04-06
2026-04-06
2026-04-06
2026-04-05
2026-04-05
2026-04-03
2026-04-03
2026-04-02
2026-04-01
2026-04-01
2026-04-01
2026-03-31
2026-03-30
2026-03-30
2026-03-30
2026-03-29
2026-03-29
2026-03-28
2026-03-27
2026-03-26
2026-03-26
2026-03-26
2026-03-25
2026-03-25
2026-03-25
2026-03-25
2026-03-24
2026-03-23
2026-03-23
2026-03-22
2026-03-22
2026-03-21
2026-03-21
2026-03-21
2026-03-21
2026-03-20
2026-03-20
2026-03-20
2026-03-19
2026-03-18
2026-03-18
2026-03-18
2026-03-17
2026-03-17
2026-03-16
2026-03-16
2026-03-16
2026-03-15
2026-03-15
2026-03-15
2026-03-14
2026-03-13
2026-03-13
2026-03-13
2026-03-12
2026-03-11
2026-03-11
2026-03-11
2026-03-10
2026-03-10
2026-03-10
2026-03-10
2026-03-09
2026-03-09
2026-03-09
2026-03-09
2026-03-09
2026-03-08
2026-03-08
2026-03-08
2026-03-07
2026-03-07
2026-03-07
2026-03-06
2026-03-06
2026-03-06
2026-03-06
2026-03-05
2026-03-05
2026-03-05
2026-03-05
2026-03-04
2026-03-04
2026-03-04
2026-03-04
2026-03-03
2026-03-03
2026-03-02
2026-03-02
2026-03-02
2026-03-02
2026-03-02
2026-03-01
2026-02-28
2026-02-28
2026-02-28
2026-02-28
2026-02-27
2026-02-27
2026-02-27
2026-02-26
2026-02-26
2026-02-26
2026-02-26
2026-02-26
2026-02-26
2026-02-25
2026-02-25
2026-02-25
2026-02-25
2026-02-25
2026-02-24
2026-02-24
2026-02-24
2026-02-24
2026-02-23
2026-02-19
2026-02-19
2026-02-19
2026-02-18
2026-02-18
2026-02-17
2026-02-17
2026-02-17
2026-02-16
2025-02-16
2025-02-14
2025-02-13
2025-02-13
2025-02-13
2025-02-13
2025-02-13
2025-02-12
2025-02-12
2025-02-12
2025-02-12
2025-02-12
2025-02-11
2025-02-11
2025-02-10
wizard/archetypes/ module2025-02-10
2025-02-10
2025-02-09
2025-02-09
2025-02-07
2025-02-07
2025-02-06
2025-02-05
2025-02-05
2025-02-04
2025-02-04
2025-02-04
2025-02-03
2025-02-03
any_exist run condition to game-level for reuse across entire codebasesrc/game/input/run_conditions.rs for input-related conditionsmouse_left_not_consumed, mouse_right_not_held, spell_input_not_blocked) to input moduleClone trait bound from any_exist function for better performance2025-02-03
2025-02-02
2025-02-02
2025-01-31
2025-01-31
2025-01-31
2025-01-31
2025-01-31
2025-01-31
2025-01-31
2025-01-31
2025-01-30
2025-01-30
2025-01-30