Imps reinforce walls next to claimed ground (heroes avoid them, ~10x slower to break)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c508e232b0
commit
a1fe02ffa6
8 files changed
+197
-13
No files matched your search
+78
-2
@@ -6,7 +6,7 @@ use macroquad::prelude::*;
|
||||
|
||||
pub const CELL: f32 = 16.0;
|
||||
const ATLAS_COLS: u32 = 16;
|
||||
const ATLAS_ROWS: u32 = 5;
|
||||
const ATLAS_ROWS: u32 = 6;
|
||||
|
||||
// atlas indices (4 variants each)
|
||||
pub const T_ROCK: u32 = 0;
|
||||
@@ -40,6 +40,12 @@ pub const I_FLAG: u32 = 68;
|
||||
pub const I_BOLT: u32 = 69;
|
||||
pub const I_HEAL: u32 = 70;
|
||||
pub const I_SUMMON: u32 = 71;
|
||||
pub const T_REINF: u32 = 72; // 4 variants: reinforced wall masonry
|
||||
pub const T_TORTURE: u32 = 76; // 4 variants: torture chamber floor
|
||||
pub const D_RACK: u32 = 80;
|
||||
pub const I_ARROW: u32 = 81;
|
||||
pub const I_CANNON: u32 = 82;
|
||||
pub const I_MAGIC: u32 = 83;
|
||||
|
||||
pub struct Gfx {
|
||||
pub atlas: Texture2D,
|
||||
@@ -365,6 +371,40 @@ fn gen_atlas() -> Image {
|
||||
_ => c(100, 60, 120),
|
||||
})
|
||||
});
|
||||
// reinforced walls: masonry in dark stone with the player's red mortar
|
||||
for v in 0..4u32 {
|
||||
cv.cell(T_REINF + v, |x, y| {
|
||||
let row = y / 4;
|
||||
let off = if row % 2 == 1 { 4 } else { 0 };
|
||||
if y % 4 == 3 || (x + off) % 8 == 7 {
|
||||
return Some(shade((70, 26, 30), (rnd(x, y, v + 90) * 8.0) as i32));
|
||||
}
|
||||
let brick = hash((x + off) / 8, row, v + 91) % 4;
|
||||
Some(shade((84, 76, 74), (rnd(x, y, v + 92) * 14.0) as i32 - 7 + brick as i32 * 5 - 6 + if y % 4 == 0 { 10 } else { 0 }))
|
||||
});
|
||||
// torture chamber: dark stones with rusty iron grates
|
||||
cv.cell(T_TORTURE + v, |x, y| {
|
||||
let grate = (4..=11).contains(&x) && (4..=11).contains(&y) && (x % 3 == 1 || y % 3 == 1);
|
||||
if grate {
|
||||
return Some(shade((96, 44, 30), (rnd(x, y, v + 93) * 12.0) as i32));
|
||||
}
|
||||
Some(stones(x, y, v + 94, (52, 40, 44), (26, 16, 18), 10))
|
||||
});
|
||||
}
|
||||
// torture wheel
|
||||
cv.cell(D_RACK, |x, y| {
|
||||
let (dx, dy) = (x as f32 - 7.5, y as f32 - 7.0);
|
||||
let d = (dx * dx + dy * dy).sqrt();
|
||||
let a = dy.atan2(dx);
|
||||
if (5.5..7.0).contains(&d) || (d < 6.0 && (a * 4.0 / std::f32::consts::PI).fract().abs() < 0.12) {
|
||||
Some(c(110, 76, 44))
|
||||
} else if y >= 13 && (x == 7 || x == 8 || (4..=11).contains(&x) && y == 15) {
|
||||
Some(c(70, 48, 30))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
|
||||
// tool icons
|
||||
cv.cell(I_PICK, |x, y| {
|
||||
let handle = (x + y == 16 || x + y == 17) && x >= 3;
|
||||
@@ -423,6 +463,39 @@ fn gen_atlas() -> Image {
|
||||
None
|
||||
}
|
||||
});
|
||||
cv.cell(I_ARROW, |x, y| {
|
||||
// a small wooden tower with an arrow
|
||||
if (4..=11).contains(&x) && y >= 7 {
|
||||
Some(if (x + y) % 4 == 0 { c(90, 60, 34) } else { c(130, 88, 50) })
|
||||
} else if y == 6 && x % 2 == 0 && (4..=11).contains(&x) {
|
||||
Some(c(130, 88, 50))
|
||||
} else if y == 3 && (2..=13).contains(&x) || (x == 12 && (y == 2 || y == 4)) {
|
||||
Some(c(220, 220, 220))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
cv.cell(I_CANNON, |x, y| {
|
||||
let barrel = y >= 4 && y <= 7 && x >= 5 && x <= 14 && (y - 4) as i32 <= 3;
|
||||
let wheel = (x - 6) * (x - 6) + (y - 10) * (y - 10) <= 9;
|
||||
if barrel {
|
||||
Some(c(50, 50, 56))
|
||||
} else if wheel {
|
||||
Some(c(120, 80, 40))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
cv.cell(I_MAGIC, |x, y| {
|
||||
let crystal = (x - 8).abs() + (y - 5).abs() <= 3;
|
||||
if crystal {
|
||||
Some(c(190, 110, 255))
|
||||
} else if (6..=9).contains(&x) && y >= 9 {
|
||||
Some(c(110, 110, 124))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
cv.cell(I_SUMMON, |x, y| {
|
||||
let d = (((x - 8) * (x - 8) + (y - 8) * (y - 8)) as f32).sqrt();
|
||||
let a = ((y - 8) as f32).atan2((x - 8) as f32);
|
||||
@@ -645,10 +718,11 @@ impl Gfx {
|
||||
Rect::new((i * SPR_CELL + 1) as f32, (1 + if white { SPR_CELL } else { 0 }) as f32, SPR as f32, SPR as f32)
|
||||
}
|
||||
|
||||
pub fn tile_tex(kind: Kind, claimed: bool, hero: bool, var: u8) -> u32 {
|
||||
pub fn tile_tex(kind: Kind, claimed: bool, hero: bool, var: u8, reinforced: bool) -> u32 {
|
||||
let v = var as u32 & 3;
|
||||
match kind {
|
||||
Kind::Rock => T_ROCK + v,
|
||||
Kind::Earth if reinforced => T_REINF + v,
|
||||
Kind::Earth => T_EARTH + v,
|
||||
Kind::Gold => T_GOLD + v,
|
||||
Kind::Floor => {
|
||||
@@ -668,6 +742,8 @@ impl Gfx {
|
||||
Kind::Core => T_COREFLOOR + v,
|
||||
Kind::Portal => T_PORTALFLOOR + v,
|
||||
Kind::Gate => T_GATEFLOOR + v,
|
||||
Kind::Torture => T_TORTURE + v,
|
||||
Kind::Tower => T_CLAIM + v,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user