use ascii_agents_core::sprite::{Rgb, RgbBuffer};
pub(super) fn paint_coffee_table(
buf: &mut RgbBuffer,
cx: u16,
cy: u16,
w: u16,
h: u16,
theme: &crate::tui::theme::Theme,
) {
let top = theme.furniture.wood_top;
let trim = theme.furniture.wood_trim;
let min_x = cx.saturating_sub(w / 2);
let max_x = (cx + w / 2 + (w & 1)).min(buf.width);
let min_y = cy.saturating_sub(h / 2);
let max_y = (cy + h / 2 + (h & 1)).min(buf.height);
for y in min_y..max_y {
for x in min_x..max_x {
let on_front = y + 1 == max_y;
buf.put(x, y, if on_front { trim } else { top });
}
}
}
pub(super) fn paint_area_rug(
buf: &mut RgbBuffer,
cx: u16,
cy: u16,
w: u16,
h: u16,
theme: &crate::tui::theme::Theme,
) {
let rug_field = theme.furniture.rug_field;
let rug_trim = theme.furniture.rug_trim;
let rug_accent = theme.furniture.rug_accent;
let half_w = w as i32 / 2;
let half_h = h as i32 / 2;
for dy in 0..h as i32 {
for dx in 0..w as i32 {
let px = cx as i32 - half_w + dx;
let py = cy as i32 - half_h + dy;
if px < 0 || py < 0 || px >= buf.width as i32 || py >= buf.height as i32 {
continue;
}
let on_border = dx == 0 || dx == w as i32 - 1 || dy == 0 || dy == h as i32 - 1;
let on_inner_border = dx == 1 || dx == w as i32 - 2 || dy == 1 || dy == h as i32 - 2;
let color = if on_border {
rug_trim
} else if on_inner_border {
rug_accent
} else {
rug_field
};
buf.put(px as u16, py as u16, color);
}
}
}
pub(super) fn paint_side_table(
buf: &mut RgbBuffer,
cx: u16,
cy: u16,
theme: &crate::tui::theme::Theme,
) {
let top = theme.furniture.wood_top;
let trim = theme.furniture.wood_trim;
let mag = theme.furniture.magazine;
let mag_trim = theme.furniture.magazine_trim;
let w: i32 = 7;
let h: i32 = 4;
for dy in 0..h {
for dx in 0..w {
let px = cx as i32 - w / 2 + dx;
let py = cy as i32 - h / 2 + dy;
if px < 0 || py < 0 || px >= buf.width as i32 || py >= buf.height as i32 {
continue;
}
let on_bottom = dy == h - 1;
buf.put(px as u16, py as u16, if on_bottom { trim } else { top });
}
}
let mag_pixels: &[((i32, i32), Rgb)] = &[
((-1, -1), mag),
((0, -1), mag),
((1, -1), mag),
((-1, 0), mag_trim),
((0, 0), mag_trim),
((1, 0), mag_trim),
];
for ((dx, dy), c) in mag_pixels {
let px = cx as i32 + dx;
let py = cy as i32 + dy;
if px >= 0 && py >= 0 && (px as u16) < buf.width && (py as u16) < buf.height {
buf.put(px as u16, py as u16, *c);
}
}
}
pub(super) fn paint_pantry_table(
buf: &mut RgbBuffer,
cx: u16,
cy: u16,
theme: &crate::tui::theme::Theme,
) {
let top = theme.furniture.wood_top;
let trim = theme.furniture.wood_trim;
let w: i32 = 7;
let h: i32 = 4;
for dy in 0..h {
for dx in 0..w {
let on_corner = (dx == 0 || dx == w - 1) && (dy == 0 || dy == h - 1);
if on_corner {
continue;
}
let px = cx as i32 - w / 2 + dx;
let py = cy as i32 - h / 2 + dy;
if px < 0 || py < 0 || px >= buf.width as i32 || py >= buf.height as i32 {
continue;
}
let on_edge = dy == h - 1;
buf.put(px as u16, py as u16, if on_edge { trim } else { top });
}
}
}
pub(super) fn paint_pantry_chair(
buf: &mut RgbBuffer,
cx: u16,
cy: u16,
theme: &crate::tui::theme::Theme,
) {
let seat = theme.furniture.chair_seat;
let trim = theme.furniture.chair_trim;
let put = |buf: &mut RgbBuffer, dx: i32, dy: i32, c: Rgb| {
let px = cx as i32 + dx;
let py = cy as i32 + dy;
if px >= 0 && py >= 0 && (px as u16) < buf.width && (py as u16) < buf.height {
buf.put(px as u16, py as u16, c);
}
};
put(buf, -1, -1, seat);
put(buf, 0, -1, seat);
put(buf, -1, 0, trim);
put(buf, 0, 0, trim);
}