Credit qwen3.8-flash-next-iq3xxs with Strata in OpenCode, with pixel marks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b4d834823b
commit
796143f20c
7 files changed
+58
-11
No files matched your search
@@ -8,5 +8,8 @@
|
|||||||
## Made with Claude Code
|
## 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.
|
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.
|
||||||
|
|
||||||
|
## Made with qwen3.8-flash-next-iq3xxs, Strata and OpenCode
|
||||||
|
Parts of the game were also developed with the language model qwen3.8-flash-next-iq3xxs, run with Strata in [OpenCode](https://opencode.ai). The two small pixel-art marks next to the second note on the title and login screens are renditions of the Qwen and the OpenCode logo. Qwen and OpenCode are trademarks of their respective owners; the marks only credit the tools and are not covered by the MIT licence of this project.
|
||||||
|
|
||||||
## Everything else
|
## Everything else
|
||||||
Code, procedural graphics and game design: the DungeonCraft project.
|
Code, procedural graphics and game design: the DungeonCraft project.
|
||||||
@@ -11,6 +11,7 @@ An evil little dungeon game for the browser - in glorious pixels, in 3D, for fre
|
|||||||
<img src="https://img.shields.io/badge/Rust-macroquad-b7410e?logo=rust&logoColor=white" alt="Rust">
|
<img src="https://img.shields.io/badge/Rust-macroquad-b7410e?logo=rust&logoColor=white" alt="Rust">
|
||||||
<img src="https://img.shields.io/badge/WebAssembly-runs%20in%20the%20browser-654ff0?logo=webassembly&logoColor=white" alt="WebAssembly">
|
<img src="https://img.shields.io/badge/WebAssembly-runs%20in%20the%20browser-654ff0?logo=webassembly&logoColor=white" alt="WebAssembly">
|
||||||
<img src="https://img.shields.io/badge/made%20with-Claude%20Code-d97757?logo=anthropic&logoColor=white" alt="Made with Claude Code">
|
<img src="https://img.shields.io/badge/made%20with-Claude%20Code-d97757?logo=anthropic&logoColor=white" alt="Made with Claude Code">
|
||||||
|
<img src="https://img.shields.io/badge/made%20with-Qwen%20%2B%20OpenCode-7b6cf6" alt="Made with qwen3.8-flash-next-iq3xxs and Strata in OpenCode">
|
||||||
<img src="https://img.shields.io/badge/license-MIT-2ea44f" alt="MIT License">
|
<img src="https://img.shields.io/badge/license-MIT-2ea44f" alt="MIT License">
|
||||||
<img src="https://img.shields.io/badge/languages-EN%20%7C%20DE-555" alt="English and German">
|
<img src="https://img.shields.io/badge/languages-EN%20%7C%20DE-555" alt="English and German">
|
||||||
</p>
|
</p>
|
||||||
@@ -157,6 +158,12 @@ the music, the texts and this page. Claude, Claude Code and Anthropic are tradem
|
|||||||
credits the tool.</p>
|
credits the tool.</p>
|
||||||
<br clear="left">
|
<br clear="left">
|
||||||
|
|
||||||
|
## Made with qwen3.8-flash-next-iq3xxs, Strata and OpenCode
|
||||||
|
|
||||||
|
Parts of DungeonCraft were also developed with the language model qwen3.8-flash-next-iq3xxs, run with Strata in
|
||||||
|
<a href="https://opencode.ai"><b>OpenCode</b></a>. Qwen and OpenCode are trademarks of their respective owners; the pixel
|
||||||
|
marks on the title screen only credit the tools.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
DungeonCraft is released under the **[MIT License](LICENSE)** - © 2026 Richard Zink. It covers the code, the generated
|
DungeonCraft is released under the **[MIT License](LICENSE)** - © 2026 Richard Zink. It covers the code, the generated
|
||||||
|
|||||||
@@ -561,6 +561,7 @@ unit.wyrm = Glutwyrm
|
|||||||
job.rest = Erholt sich im Horst
|
job.rest = Erholt sich im Horst
|
||||||
job.torment = Bearbeitet einen Gefangenen
|
job.torment = Bearbeitet einen Gefangenen
|
||||||
menu.made_with = Erstellt mit Hilfe von Claude Code
|
menu.made_with = Erstellt mit Hilfe von Claude Code
|
||||||
|
menu.made_with_qwen = Erstellt mit Hilfe von qwen3.8-flash-next-iq3xxs mit Strata in OpenCode
|
||||||
menu.license = DungeonCraft - MIT-Lizenz - (c) 2026 Richard Zink
|
menu.license = DungeonCraft - MIT-Lizenz - (c) 2026 Richard Zink
|
||||||
|
|
||||||
# steel walls
|
# steel walls
|
||||||
|
|||||||
@@ -562,6 +562,7 @@ unit.wyrm = Ember Wyrm
|
|||||||
job.rest = Recovering in the aerie
|
job.rest = Recovering in the aerie
|
||||||
job.torment = Working on a prisoner
|
job.torment = Working on a prisoner
|
||||||
menu.made_with = Made with the help of Claude Code
|
menu.made_with = Made with the help of Claude Code
|
||||||
|
menu.made_with_qwen = Made with the help of qwen3.8-flash-next-iq3xxs with Strata in OpenCode
|
||||||
menu.license = DungeonCraft - MIT License - (c) 2026 Richard Zink
|
menu.license = DungeonCraft - MIT License - (c) 2026 Richard Zink
|
||||||
|
|
||||||
# steel walls
|
# steel walls
|
||||||
|
|||||||
@@ -1480,6 +1480,7 @@ async fn main() {
|
|||||||
}
|
}
|
||||||
MenuAction::OpenRepo => platform::open_url(menu::REPO_URL),
|
MenuAction::OpenRepo => platform::open_url(menu::REPO_URL),
|
||||||
MenuAction::OpenClaudeCode => platform::open_url(menu::CLAUDE_CODE_URL),
|
MenuAction::OpenClaudeCode => platform::open_url(menu::CLAUDE_CODE_URL),
|
||||||
|
MenuAction::OpenOpenCode => platform::open_url(menu::OPENCODE_URL),
|
||||||
a @ (MenuAction::Login(..)
|
a @ (MenuAction::Login(..)
|
||||||
| MenuAction::Logout
|
| MenuAction::Logout
|
||||||
| MenuAction::OpenAccount
|
| MenuAction::OpenAccount
|
||||||
|
|||||||
+44
-10
@@ -260,6 +260,7 @@ enum Btn {
|
|||||||
Goals,
|
Goals,
|
||||||
Repo,
|
Repo,
|
||||||
ClaudeCode,
|
ClaudeCode,
|
||||||
|
OpenCode,
|
||||||
Field(usize),
|
Field(usize),
|
||||||
DoLogin,
|
DoLogin,
|
||||||
Account,
|
Account,
|
||||||
@@ -292,6 +293,7 @@ enum Btn {
|
|||||||
|
|
||||||
pub const REPO_URL: &str = "https://git.familie-zink.org/zink/dungeoncraft";
|
pub const REPO_URL: &str = "https://git.familie-zink.org/zink/dungeoncraft";
|
||||||
pub const CLAUDE_CODE_URL: &str = "https://claude.com/claude-code";
|
pub const CLAUDE_CODE_URL: &str = "https://claude.com/claude-code";
|
||||||
|
pub const OPENCODE_URL: &str = "https://opencode.ai";
|
||||||
|
|
||||||
// the game version (file VERSION, "vYYYYMM-NNNNN"): tools/bump_version.py raises it with every
|
// the game version (file VERSION, "vYYYYMM-NNNNN"): tools/bump_version.py raises it with every
|
||||||
// change, and the title screen and the pause menu show it
|
// change, and the title screen and the pause menu show it
|
||||||
@@ -310,9 +312,27 @@ const CLAUDE_MARK: [&str; 5] = [
|
|||||||
"....#.#....#.#....",
|
"....#.#....#.#....",
|
||||||
];
|
];
|
||||||
|
|
||||||
pub fn draw_claude_mark(x: f32, y: f32, px: f32) {
|
// pixel renditions of the Qwen and the OpenCode mark (the second "made with" note)
|
||||||
let c = Color::from_rgba(0xd9, 0x77, 0x57, 255);
|
const QWEN_MARK: [&str; 5] = [
|
||||||
for (r, row) in CLAUDE_MARK.iter().enumerate() {
|
"...###...",
|
||||||
|
".##.#.##.",
|
||||||
|
"#..###..#",
|
||||||
|
".##.#.##.",
|
||||||
|
"...###...",
|
||||||
|
];
|
||||||
|
const OPENCODE_MARK: [&str; 5] = [
|
||||||
|
"#######",
|
||||||
|
"#.....#",
|
||||||
|
"#.#...#",
|
||||||
|
"#..#.##",
|
||||||
|
"#######",
|
||||||
|
];
|
||||||
|
const CLAUDE_COL: Color = Color { r: 0xd9 as f32 / 255.0, g: 0x77 as f32 / 255.0, b: 0x57 as f32 / 255.0, a: 1.0 };
|
||||||
|
const QWEN_COL: Color = Color { r: 0x7b as f32 / 255.0, g: 0x6c as f32 / 255.0, b: 0xf6 as f32 / 255.0, a: 1.0 };
|
||||||
|
const OPENCODE_COL: Color = Color { r: 0.86, g: 0.86, b: 0.88, a: 1.0 };
|
||||||
|
|
||||||
|
fn draw_mark(mark: &[&str], x: f32, y: f32, px: f32, c: Color) {
|
||||||
|
for (r, row) in mark.iter().enumerate() {
|
||||||
for (k, ch) in row.chars().enumerate() {
|
for (k, ch) in row.chars().enumerate() {
|
||||||
if ch == '#' {
|
if ch == '#' {
|
||||||
draw_rectangle(x + k as f32 * px, y + r as f32 * px, px, px, c);
|
draw_rectangle(x + k as f32 * px, y + r as f32 * px, px, px, c);
|
||||||
@@ -321,6 +341,7 @@ pub fn draw_claude_mark(x: f32, y: f32, px: f32) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub enum MenuAction {
|
pub enum MenuAction {
|
||||||
None,
|
None,
|
||||||
Consumed,
|
Consumed,
|
||||||
@@ -353,6 +374,7 @@ pub enum MenuAction {
|
|||||||
CampaignStart(usize),
|
CampaignStart(usize),
|
||||||
OpenRepo,
|
OpenRepo,
|
||||||
OpenClaudeCode,
|
OpenClaudeCode,
|
||||||
|
OpenOpenCode,
|
||||||
Login(String, String),
|
Login(String, String),
|
||||||
Logout,
|
Logout,
|
||||||
OpenAccount,
|
OpenAccount,
|
||||||
@@ -646,6 +668,7 @@ impl Menu {
|
|||||||
Some(Btn::NameField) => MenuAction::EditName,
|
Some(Btn::NameField) => MenuAction::EditName,
|
||||||
Some(Btn::Repo) => MenuAction::OpenRepo,
|
Some(Btn::Repo) => MenuAction::OpenRepo,
|
||||||
Some(Btn::ClaudeCode) => MenuAction::OpenClaudeCode,
|
Some(Btn::ClaudeCode) => MenuAction::OpenClaudeCode,
|
||||||
|
Some(Btn::OpenCode) => MenuAction::OpenOpenCode,
|
||||||
Some(Btn::Field(i)) => {
|
Some(Btn::Field(i)) => {
|
||||||
self.focus = i;
|
self.focus = i;
|
||||||
if matches!(self.page, Some(Page::Match { .. })) {
|
if matches!(self.page, Some(Page::Match { .. })) {
|
||||||
@@ -882,19 +905,30 @@ impl Menu {
|
|||||||
pub fn draw_license(&mut self, gfx: &Gfx) {
|
pub fn draw_license(&mut self, gfx: &Gfx) {
|
||||||
let (sw, sh) = (sw(), sh());
|
let (sw, sh) = (sw(), sh());
|
||||||
let (mx, my) = mouse();
|
let (mx, my) = mouse();
|
||||||
// "made with Claude Code" with the pixel mark, a link to Claude Code
|
// "made with" notes with their pixel marks, links to the tools:
|
||||||
let made = tr("menu.made_with");
|
// Claude Code, then qwen3.8-flash-next-iq3xxs with Strata in OpenCode
|
||||||
let px = (SMALL() * 2.0).round().max(2.0);
|
let px = (SMALL() * 2.0).round().max(2.0);
|
||||||
let mark_w = 18.0 * px;
|
let credits: [(&[&[&str]], &[Color], String, Color, Btn, f32); 2] = [
|
||||||
|
(&[&CLAUDE_MARK], &[CLAUDE_COL], tr("menu.made_with"), CLAUDE_COL, Btn::ClaudeCode, 4.6),
|
||||||
|
(&[&QWEN_MARK, &OPENCODE_MARK], &[QWEN_COL, OPENCODE_COL], tr("menu.made_with_qwen"), QWEN_COL, Btn::OpenCode, 3.6),
|
||||||
|
];
|
||||||
|
for (marks, cols, made, col, btn, row) in credits {
|
||||||
|
let widths: Vec<f32> = marks.iter().map(|m| m[0].len() as f32 * px).collect();
|
||||||
|
let mark_w: f32 = widths.iter().sum::<f32>() + px * 2.0 * (marks.len() as f32 - 1.0);
|
||||||
let tw = gfx.measure(&made, SMALL());
|
let tw = gfx.measure(&made, SMALL());
|
||||||
let total = mark_w + CW() * 0.5 + tw;
|
let total = mark_w + CW() * 0.5 + tw;
|
||||||
let mx0 = grid_center(sw, total);
|
let mx0 = grid_center(sw, total);
|
||||||
let my0 = sh - CH() * 4.0;
|
let my0 = sh - CH() * row;
|
||||||
let r = Rect::new(mx0, my0, total, GH * SMALL() + 2.0);
|
let r = Rect::new(mx0, my0, total, GH * SMALL() + 2.0);
|
||||||
let hot = r.contains(vec2(mx, my));
|
let hot = r.contains(vec2(mx, my));
|
||||||
draw_claude_mark(mx0, my0 + (GH * SMALL() - 5.0 * px) * 0.5, px);
|
let mut x = mx0;
|
||||||
gfx.text(&made, mx0 + mark_w + CW() * 0.5, my0, SMALL(), if hot { FRAME_HI } else { Color::from_rgba(0xd9, 0x77, 0x57, 255) });
|
for (k, m) in marks.iter().enumerate() {
|
||||||
self.buttons.push((r, Btn::ClaudeCode));
|
draw_mark(m, x, my0 + (GH * SMALL() - 5.0 * px) * 0.5, px, cols[k]);
|
||||||
|
x += widths[k] + px * 2.0;
|
||||||
|
}
|
||||||
|
gfx.text(&made, mx0 + mark_w + CW() * 0.5, my0, SMALL(), if hot { FRAME_HI } else { col });
|
||||||
|
self.buttons.push((r, btn));
|
||||||
|
}
|
||||||
let lic = tr("menu.license");
|
let lic = tr("menu.license");
|
||||||
gfx.text(&lic, grid_center(sw, gfx.measure(&lic, SMALL())), sh - CH() * 2.5, SMALL(), DIM);
|
gfx.text(&lic, grid_center(sw, gfx.measure(&lic, SMALL())), sh - CH() * 2.5, SMALL(), DIM);
|
||||||
let ver = tr("menu.version");
|
let ver = tr("menu.version");
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ html = f"""<!DOCTYPE html>
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<canvas id="glcanvas" tabindex="1" oncontextmenu="return false"></canvas>
|
<canvas id="glcanvas" tabindex="1" oncontextmenu="return false"></canvas>
|
||||||
<!-- DungeonCraft standalone - MIT License - (c) 2026 Richard Zink - https://git.familie-zink.org/zink/dungeoncraft - made with the help of Claude Code (https://claude.com/claude-code) -->
|
<!-- DungeonCraft standalone - MIT License - (c) 2026 Richard Zink - https://git.familie-zink.org/zink/dungeoncraft - made with the help of Claude Code (https://claude.com/claude-code) and qwen3.8-flash-next-iq3xxs with Strata in OpenCode (https://opencode.ai) -->
|
||||||
<script>var register_plugin; /* expected by the quad_net plugin in the bundle */</script>
|
<script>var register_plugin; /* expected by the quad_net plugin in the bundle */</script>
|
||||||
<script>
|
<script>
|
||||||
// the game module is embedded: fetching it is answered from these bytes
|
// the game module is embedded: fetching it is answered from these bytes
|
||||||
|
|||||||
Reference in new issue
Block a user