Drawbridges (down, up, automatic), frost spell and obsidian over cooled lava
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
76c23a06f0
commit
34b4640d85
32 files changed
+869
-31
No files matched your search
+51
-3
@@ -80,6 +80,9 @@ pub const T_ARENA: u32 = 178;
|
||||
pub const T_ALTAR: u32 = 182;
|
||||
pub const I_ORDERS: u32 = 186; // attack, guard
|
||||
pub const T_RIVAL3: u32 = 189; // 4 variants: floor of the yellow master
|
||||
pub const I_DRAWBRIDGE: u32 = 193; // drawbridge tool: a raised flap on chains
|
||||
pub const I_FREEZE: u32 = 194; // frost spell: a snowflake
|
||||
pub const T_OBSIDIAN: u32 = 195; // 4 variants: cooled lava, dark glass with glowing seams
|
||||
|
||||
pub struct Gfx {
|
||||
pub atlas: Texture2D,
|
||||
@@ -803,6 +806,50 @@ fn gen_atlas() -> Image {
|
||||
None
|
||||
}
|
||||
});
|
||||
// drawbridge tool icon: a raised flap with its chains above a river
|
||||
cv.cell(I_DRAWBRIDGE, |x, y| {
|
||||
if (3..=5).contains(&x) && (2..=12).contains(&y) {
|
||||
Some(if y % 3 == 0 { c(70, 46, 26) } else { c(150, 106, 60) })
|
||||
} else if y == 12 && (5..=13).contains(&x) {
|
||||
Some(c(110, 76, 44))
|
||||
} else if (x - 5) * 2 == (y - 2) * 1 + 2 && (6..=12).contains(&x) {
|
||||
Some(c(170, 170, 180)) // chain
|
||||
} else if x == 13 && (3..=12).contains(&y) {
|
||||
Some(c(90, 90, 100)) // post
|
||||
} else if y >= 13 && (1..=14).contains(&x) {
|
||||
Some(c(60, 110, 170))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
// frost spell icon: a snowflake
|
||||
cv.cell(I_FREEZE, |x, y| {
|
||||
let (dx, dy) = (x - 8, y - 8);
|
||||
let arm = dx == 0 || dy == 0 || dx == dy || dx == -dy;
|
||||
let r = dx.abs().max(dy.abs());
|
||||
if arm && r <= 6 {
|
||||
Some(if r <= 1 { c(240, 250, 255) } else { c(150, 210, 255) })
|
||||
} else if r == 4 && (dx.abs() == 1 || dy.abs() == 1) && (dx == 0 || dy == 0 || dx.abs() == dy.abs() + 1 || dy.abs() == dx.abs() + 1) {
|
||||
Some(c(200, 235, 255))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
// obsidian: cooled lava, dark glass with a few glowing seams
|
||||
for v in 0..4u32 {
|
||||
cv.cell(T_OBSIDIAN + v, |x, y| {
|
||||
let r = hash(x, y, v + 400);
|
||||
if (x * 5 + y * 3 + v as i32 * 7) % 29 == 0 || ((x + 2 * y + v as i32) % 23 == 0 && r % 2 == 0) {
|
||||
Some(c(230, 90, 30))
|
||||
} else if r % 11 == 0 {
|
||||
Some(c(70, 60, 90))
|
||||
} else if (x + y) % 7 == 0 {
|
||||
Some(c(34, 26, 40))
|
||||
} else {
|
||||
Some(c(22, 16, 26))
|
||||
}
|
||||
});
|
||||
}
|
||||
// ---- more treasures: veins (earth with embedded pieces) and treasury piles
|
||||
let vein = |x: i32, y: i32, v: u32, seed: u32, hi: Color, mid: Color, lo: Color, size: f32| -> Color {
|
||||
let mut best = 99.0f32;
|
||||
@@ -1927,7 +1974,8 @@ impl Gfx {
|
||||
Kind::Tower => T_CLAIM + v,
|
||||
Kind::Water => T_WATER + v,
|
||||
Kind::Lava => T_LAVA + v,
|
||||
Kind::Bridge => T_BRIDGE + (v & 1),
|
||||
Kind::Bridge | Kind::Drawbridge => T_BRIDGE + (v & 1),
|
||||
Kind::Obsidian => T_OBSIDIAN + v,
|
||||
Kind::LavaBridge => T_STONEBRIDGE + (v & 1),
|
||||
Kind::Shard => T_HEROFLOOR + v,
|
||||
Kind::Aerie => T_AERIE + v,
|
||||
@@ -2137,8 +2185,8 @@ mod doc_images {
|
||||
for (k, t) in crate::traps::TRAP_KINDS.iter().enumerate() {
|
||||
save(&atlas, Gfx::cell(I_TRAPS + k as u32), 4, &format!("docs/img/icons/{}.png", t.id()));
|
||||
}
|
||||
for (k, s) in crate::spells::SPELLS.iter().enumerate() {
|
||||
save(&atlas, Gfx::cell(I_SPELLS + k as u32), 4, &format!("docs/img/icons/{}.png", s.id()));
|
||||
for s in crate::spells::SPELLS.iter() {
|
||||
save(&atlas, Gfx::cell(crate::spells::spell_icon(*s)), 4, &format!("docs/img/icons/{}.png", s.id()));
|
||||
}
|
||||
for (id, cell) in [("lightning", I_BOLT), ("heal", I_HEAL), ("summon", I_SUMMON), ("arrow", I_ARROW), ("cannon", I_CANNON), ("magic", I_MAGIC), ("rune", I_RUNE)] {
|
||||
save(&atlas, Gfx::cell(cell), 4, &format!("docs/img/icons/{}.png", id));
|
||||
|
||||
Reference in new issue
Block a user