v0.5: Blue sky gradient, acid rework, iron, phase transitions, shadows (experimental)
- Blue sky gradient background (y<600 blue, 600-700 gradient, y>700 dark) - Acid system: health-based damage via acid_resist, not instant delete - New material: Iron (ID 16) - acid-proof, heat-conductive, reflective - Phase transitions: Iron→Lava (150°C), Sand→Glass (200°C), Glass→Lava (160°C) - Stone no longer melts (lava containment) - Heat transfer formula improved (divisor 255→200) - Iron metallic texture with bright highlights + light reflection - Shadow system attempted (grid-based, per-pixel) - reverted, needs rethink - Updated AGENTS.md for next session
This commit is contained in:
+8
-1
@@ -93,8 +93,11 @@ fn main() {
|
||||
}
|
||||
}
|
||||
|
||||
grid.fill_circle(400, 500, 15, 16);
|
||||
grid.fill_circle(400, 500, 8, 9);
|
||||
|
||||
let cam_x = 400i32;
|
||||
let cam_y = 630i32;
|
||||
let cam_y = 500i32;
|
||||
let zoom = 2.0f32;
|
||||
|
||||
let mut frame = 0;
|
||||
@@ -113,6 +116,10 @@ fn main() {
|
||||
println!("--- {}s (frame {}) fps: {:.0} ---", frame / 60, frame, fps);
|
||||
println!("fire: {}, wood: {}, spark: {}, smoke: {}", fire, wood, spark, smoke);
|
||||
|
||||
let idx_inner = grid.index(400, 492);
|
||||
let idx_outer = grid.index(400, 489);
|
||||
println!("(400,492): m={} t={} (400,489): m={} t={}", grid.materials[idx_inner], grid.temps[idx_inner], grid.materials[idx_outer], grid.temps[idx_outer]);
|
||||
|
||||
if fire == 0 {
|
||||
let elapsed = start.elapsed();
|
||||
let fps = frame as f64 / elapsed.as_secs_f64();
|
||||
|
||||
@@ -81,7 +81,7 @@ pub static PROPS: [MaterialProps; M] = [
|
||||
MaterialProps { color: [100, 255, 60, 200], density: 30, is_powder: false, is_liquid: true, is_gas: false, is_solid: false, is_static: false, flammability: 0, melt_temp: 0, boil_temp: 150, heat_conduct: 15, acid_resist: 255, light_emit: 0, light_block: 80 },
|
||||
MaterialProps { color: [255, 180, 40, 255], density: 1, is_powder: false, is_liquid: false, is_gas: true, is_solid: false, is_static: false, flammability: 0, melt_temp: 255, boil_temp: 255, heat_conduct: 30, acid_resist: 255, light_emit: 180, light_block: 30 },
|
||||
MaterialProps { color: [160, 155, 150, 200], density: 1, is_powder: false, is_liquid: false, is_gas: true, is_solid: false, is_static: false, flammability: 0, melt_temp: 255, boil_temp: 255, heat_conduct: 5, acid_resist: 255, light_emit: 0, light_block: 80 },
|
||||
MaterialProps { color: [200, 200, 210, 255], density: 110, is_powder: false, is_liquid: false, is_gas: false, is_solid: true, is_static: true, flammability: 0, melt_temp: 200, boil_temp: 255, heat_conduct: 200, acid_resist: 255, light_emit: 0, light_block: 150 },
|
||||
MaterialProps { color: [200, 200, 210, 255], density: 110, is_powder: false, is_liquid: false, is_gas: false, is_solid: true, is_static: true, flammability: 0, melt_temp: 150, boil_temp: 255, heat_conduct: 80, acid_resist: 255, light_emit: 0, light_block: 150 },
|
||||
];
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
@@ -133,12 +133,15 @@ pub fn interact(a: u8, b: u8) -> Interaction {
|
||||
|
||||
pub fn transform(temp: u8, material: u8) -> u8 {
|
||||
match material {
|
||||
3 => if temp >= 200 { 10 } else { 3 },
|
||||
4 => if temp >= 100 { 8 } else { 4 },
|
||||
11 => if temp >= 5 { 4 } else { 11 },
|
||||
5 => if temp >= 240 { 9 } else { 5 },
|
||||
6 => if temp <= 5 { 1 } else { 6 },
|
||||
8 => if temp <= 80 { 4 } else { 8 },
|
||||
5 => if temp >= 240 { 9 } else { 5 },
|
||||
10 => if temp >= 160 { 6 } else { 10 },
|
||||
11 => if temp >= 5 { 4 } else { 11 },
|
||||
12 => if temp >= 120 { 9 } else { 12 },
|
||||
16 => if temp >= 180 { 6 } else { 16 },
|
||||
_ => material,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,14 +91,23 @@ impl RenderBuffer {
|
||||
let lvl = self.light[li] as u32;
|
||||
|
||||
if mat == 0 {
|
||||
let bg = [20u32, 20, 30];
|
||||
let sky_r = 80u32;
|
||||
let sky_g = 140u32;
|
||||
let sky_b = 220u32;
|
||||
let dark_r = 20u32;
|
||||
let dark_g = 20u32;
|
||||
let dark_b = 30u32;
|
||||
let gyt = ((gy as i32 - 600) * 255 / 100).clamp(0, 255) as u32;
|
||||
let bg_r = (sky_r * (255 - gyt) + dark_r * gyt) / 255;
|
||||
let bg_g = (sky_g * (255 - gyt) + dark_g * gyt) / 255;
|
||||
let bg_b = (sky_b * (255 - gyt) + dark_b * gyt) / 255;
|
||||
let glow_r = 255u32;
|
||||
let glow_g = 160u32;
|
||||
let glow_b = 40u32;
|
||||
let t = ((lvl * lvl) / 255).min(255);
|
||||
let r = (bg[0] * (255 - t) + glow_r * t) / 255;
|
||||
let g = (bg[1] * (255 - t) + glow_g * t) / 255;
|
||||
let b = (bg[2] * (255 - t) + glow_b * t) / 255;
|
||||
let r = (bg_r * (255 - t) + glow_r * t) / 255;
|
||||
let g = (bg_g * (255 - t) + glow_g * t) / 255;
|
||||
let b = (bg_b * (255 - t) + glow_b * t) / 255;
|
||||
[r as u8, g as u8, b as u8, 255]
|
||||
} else {
|
||||
let props = &PROPS[mat as usize];
|
||||
@@ -133,7 +142,17 @@ impl RenderBuffer {
|
||||
[r, g, b, base[3]]
|
||||
}
|
||||
} else {
|
||||
[20, 20, 30, 255]
|
||||
let sky_r = 80u32;
|
||||
let sky_g = 140u32;
|
||||
let sky_b = 220u32;
|
||||
let dark_r = 20u32;
|
||||
let dark_g = 20u32;
|
||||
let dark_b = 30u32;
|
||||
let gyt = ((gy as i32 - 600) * 255 / 100).clamp(0, 255) as u32;
|
||||
let r = (sky_r * (255 - gyt) + dark_r * gyt) / 255;
|
||||
let g = (sky_g * (255 - gyt) + dark_g * gyt) / 255;
|
||||
let b = (sky_b * (255 - gyt) + dark_b * gyt) / 255;
|
||||
[r as u8, g as u8, b as u8, 255]
|
||||
};
|
||||
|
||||
let pi = ((py * rw + px) * 4) as usize;
|
||||
|
||||
Reference in New Issue
Block a user