89 lines
2.1 KiB
Rust
89 lines
2.1 KiB
Rust
use std::path::Path;
|
|
use std::process::Command;
|
|
|
|
fn main()
|
|
{
|
|
compile_ink_stories();
|
|
|
|
let wesl = wesl::Wesl::new("src/shaders");
|
|
wesl.build_artifact(&"package::main".parse().unwrap(), "main");
|
|
wesl.build_artifact(&"package::shadow".parse().unwrap(), "shadow");
|
|
}
|
|
|
|
fn compile_ink_stories()
|
|
{
|
|
let dialogs_dir = Path::new("assets/dialogs");
|
|
|
|
if !dialogs_dir.exists()
|
|
{
|
|
return;
|
|
}
|
|
|
|
let inklecate = Path::new("tools/inklecate.dll");
|
|
|
|
if !inklecate.exists()
|
|
{
|
|
eprintln!("cargo:warning=tools/inklecate.dll not found — ink stories will not be compiled");
|
|
return;
|
|
}
|
|
|
|
let entries = match std::fs::read_dir(dialogs_dir)
|
|
{
|
|
Ok(e) => e,
|
|
Err(_) => return,
|
|
};
|
|
|
|
for entry in entries.flatten()
|
|
{
|
|
let path = entry.path();
|
|
|
|
if path.extension().and_then(|e| e.to_str()) != Some("ink")
|
|
{
|
|
continue;
|
|
}
|
|
|
|
let ink_path = path.to_str().unwrap();
|
|
let json_path = format!("{}.json", ink_path);
|
|
|
|
println!("cargo:rerun-if-changed={ink_path}");
|
|
|
|
let ink_modified = std::fs::metadata(ink_path).and_then(|m| m.modified()).ok();
|
|
let json_modified = std::fs::metadata(&json_path)
|
|
.and_then(|m| m.modified())
|
|
.ok();
|
|
|
|
let needs_compile = match (ink_modified, json_modified)
|
|
{
|
|
(Some(ink_time), Some(json_time)) => ink_time > json_time,
|
|
_ => true,
|
|
};
|
|
|
|
if !needs_compile
|
|
{
|
|
continue;
|
|
}
|
|
|
|
println!("cargo:warning=Compiling {ink_path}");
|
|
|
|
let status = Command::new("dotnet")
|
|
.args([inklecate.to_str().unwrap(), "-o", &json_path, ink_path])
|
|
.status();
|
|
|
|
match status
|
|
{
|
|
Ok(s) if s.success() =>
|
|
{
|
|
println!("cargo:warning=Compiled {ink_path} → {json_path}");
|
|
}
|
|
Ok(s) =>
|
|
{
|
|
println!("cargo:warning=inklecate exited with {s} for {ink_path}");
|
|
}
|
|
Err(e) =>
|
|
{
|
|
println!("cargo:warning=Failed to run dotnet inklecate: {e}");
|
|
}
|
|
}
|
|
}
|
|
}
|