diff --git a/CREDITS.md b/CREDITS.md index 11b0c61..ce350b5 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -5,5 +5,8 @@ - License: **Creative Commons Attribution 4.0 International (CC BY 4.0)** – https://creativecommons.org/licenses/by/4.0/ - File: `assets/dbyte_1x.png` (unmodified). In the game it is scaled by integer factors and tinted. The swapped glyphs ö/ò are corrected in the character mapping, not in the file. +## Made with Claude Code +The game was developed with the help of [Claude Code](https://claude.com/claude-code), Anthropic's AI coding assistant. The small pixel-art mark next to the note on the title and login screens is a rendition of the Claude Code logo. Claude, Claude Code and Anthropic are trademarks of Anthropic; the mark only credits the tool and is not covered by the MIT licence of this project. + ## Everything else Code, procedural graphics and game design: the DungeonCraft project. diff --git a/README.md b/README.md index 54ea47f..99c7410 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # DungeonCraft +> **Made with the help of [Claude Code](https://claude.com/claude-code).** The code, graphics, texts and +> documentation of this game were written together with Claude Code, Anthropic's AI coding assistant. + An original dungeon building & defence game that runs in the browser (Rust + [macroquad](https://github.com/not-fl3/macroquad), compiled to WebAssembly). Dig out your underground realm, claim the portal to attract creatures, keep them fed, rested and paid, fend off endless hero waves that adapt to your army – and finally destroy the Hero Gate. diff --git a/lang/de.lang b/lang/de.lang index f6384eb..2509708 100644 --- a/lang/de.lang +++ b/lang/de.lang @@ -551,6 +551,7 @@ unit.owl = Arkane Eule unit.wyrm = Glutwyrm job.rest = Erholt sich im Horst job.torment = Bearbeitet einen Gefangenen +menu.made_with = Erstellt mit Hilfe von Claude Code menu.license = DungeonCraft - MIT-Lizenz - (c) 2026 Richard Zink # steel walls diff --git a/lang/en.lang b/lang/en.lang index 06fd7cc..bc9e3b1 100644 --- a/lang/en.lang +++ b/lang/en.lang @@ -552,6 +552,7 @@ unit.owl = Arcane Owl unit.wyrm = Ember Wyrm job.rest = Recovering in the aerie job.torment = Working on a prisoner +menu.made_with = Made with the help of Claude Code menu.license = DungeonCraft - MIT License - (c) 2026 Richard Zink # steel walls diff --git a/src/main.rs b/src/main.rs index 1a45448..3baf024 100644 --- a/src/main.rs +++ b/src/main.rs @@ -792,6 +792,7 @@ async fn main() { autosave_t = 0.0; } MenuAction::OpenRepo => platform::open_url(menu::REPO_URL), + MenuAction::OpenClaudeCode => platform::open_url(menu::CLAUDE_CODE_URL), a @ (MenuAction::Login(..) | MenuAction::Logout | MenuAction::OpenAccount diff --git a/src/menu.rs b/src/menu.rs index 2625bf4..4b4bd75 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -205,6 +205,7 @@ enum Btn { StartMission, Goals, Repo, + ClaudeCode, Field(usize), DoLogin, Account, @@ -216,6 +217,27 @@ enum Btn { } pub const REPO_URL: &str = "https://git.familie-zink.org/zink/dungeoncraft"; +pub const CLAUDE_CODE_URL: &str = "https://claude.com/claude-code"; + +// the Claude Code mark as pixel art (drawn next to the "made with" note) +const CLAUDE_MARK: [&str; 5] = [ + "...############...", + "...##.######.##...", + ".################.", + "...############...", + "....#.#....#.#....", +]; + +pub fn draw_claude_mark(x: f32, y: f32, px: f32) { + let c = Color::from_rgba(0xd9, 0x77, 0x57, 255); + for (r, row) in CLAUDE_MARK.iter().enumerate() { + for (k, ch) in row.chars().enumerate() { + if ch == '#' { + draw_rectangle(x + k as f32 * px, y + r as f32 * px, px, px, c); + } + } + } +} pub enum MenuAction { None, @@ -236,6 +258,7 @@ pub enum MenuAction { EditName, // the name field was tapped (touch: ask with a browser dialog) StartMission(usize), OpenRepo, + OpenClaudeCode, Login(String, String), Logout, OpenAccount, @@ -478,6 +501,7 @@ impl Menu { } Some(Btn::NameField) => MenuAction::EditName, Some(Btn::Repo) => MenuAction::OpenRepo, + Some(Btn::ClaudeCode) => MenuAction::OpenClaudeCode, Some(Btn::Field(i)) => { self.focus = i; MenuAction::EditField(i) @@ -620,6 +644,19 @@ impl Menu { pub fn draw_license(&mut self, gfx: &Gfx) { let (sw, sh) = (sw(), sh()); let (mx, my) = mouse(); + // "made with Claude Code" with the pixel mark, a link to Claude Code + let made = tr("menu.made_with"); + let px = (SMALL() * 2.0).round().max(2.0); + let mark_w = 18.0 * px; + let tw = gfx.measure(&made, SMALL()); + let total = mark_w + CW() * 0.5 + tw; + let mx0 = grid_center(sw, total); + let my0 = sh - CH() * 4.0; + let r = Rect::new(mx0, my0, total, GH * SMALL() + 2.0); + let hot = r.contains(vec2(mx, my)); + draw_claude_mark(mx0, my0 + (GH * SMALL() - 5.0 * px) * 0.5, px); + gfx.text(&made, mx0 + mark_w + CW() * 0.5, my0, SMALL(), if hot { FRAME_HI } else { Color::from_rgba(0xd9, 0x77, 0x57, 255) }); + self.buttons.push((r, Btn::ClaudeCode)); let lic = tr("menu.license"); gfx.text(&lic, grid_center(sw, gfx.measure(&lic, SMALL())), sh - CH() * 2.5, SMALL(), DIM); let url = REPO_URL.trim_start_matches("https://"); diff --git a/tools/make_standalone.py b/tools/make_standalone.py index ffd080f..a89d590 100644 --- a/tools/make_standalone.py +++ b/tools/make_standalone.py @@ -39,7 +39,7 @@ html = f"""
- +