#![allow(dead_code)]
use std::path::PathBuf;
use neurodoom::math::Fixed;
pub const DEFAULT_WAD_PATH: &str = "doom1.wad";
pub fn load_wad() -> std::io::Result<(Vec<u8>, PathBuf)> {
let path: PathBuf = std::env::var_os("DOOM_WAD")
.map(PathBuf::from)
.unwrap_or_else(|| PathBuf::from(DEFAULT_WAD_PATH));
let bytes = std::fs::read(&path)?;
Ok((bytes, path))
}
pub fn arg_or(default: &str) -> String {
std::env::args().nth(1).unwrap_or_else(|| default.to_string())
}
#[inline]
pub fn depth_to_rgb(d: Fixed) -> u32 {
if d <= 0 {
return 0;
}
let v = ((500_000_000i64 / d as i64) as u32).min(255);
(v << 16) | (v << 8) | v
}
pub struct Lcg {
state: u64,
}
impl Lcg {
pub fn new(seed: u64) -> Self {
Self { state: seed.max(1) }
}
pub fn next(&mut self) -> u32 {
self.state = self
.state
.wrapping_mul(6364136223846793005)
.wrapping_add(1442695040888963407);
(self.state >> 33) as u32
}
pub fn next_in(&mut self, n: usize) -> usize {
(self.next() as usize) % n.max(1)
}
}
pub fn seed_from_clock() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_nanos() as u64)
.unwrap_or(0xC0FFEE)
}