mirror of
https://github.com/SpaceManiac/SpacemanDMM.git
synced 2025-12-23 05:36:47 +00:00
80 lines
2.6 KiB
Rust
80 lines
2.6 KiB
Rust
use super::*;
|
|
|
|
#[derive(Default)]
|
|
pub struct Spawners;
|
|
impl RenderPass for Spawners {
|
|
fn path_filter(&self, path: &str) -> bool {
|
|
subpath(path, "/obj/effect/spawner/structure/") || !subpath(path, "/obj/effect/spawner/")
|
|
}
|
|
|
|
fn expand<'a>(&self,
|
|
atom: &Atom<'a>,
|
|
objtree: &'a ObjectTree,
|
|
output: &mut Vec<Atom<'a>>,
|
|
) -> bool {
|
|
if !atom.istype("/obj/effect/spawner/structure/") {
|
|
return true;
|
|
}
|
|
match atom.get_var("spawn_list", objtree) {
|
|
&Constant::List(ref elements) => {
|
|
for &(ref key, _) in elements {
|
|
// TODO: use a more civilized lookup method
|
|
let type_key;
|
|
let reference = match key {
|
|
&Constant::String(ref s) => s,
|
|
&Constant::Prefab(ref fab) => {
|
|
type_key = dm::ast::FormatTreePath(&fab.path).to_string();
|
|
&type_key
|
|
},
|
|
_ => continue,
|
|
};
|
|
output.push(Atom::from_type(objtree, reference, atom.loc).unwrap());
|
|
}
|
|
false // don't include the original atom
|
|
}
|
|
_ => { true } // TODO: complain?
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Default)]
|
|
pub struct GravityGen;
|
|
impl RenderPass for GravityGen {
|
|
fn overlays<'a>(&self,
|
|
atom: &Atom<'a>,
|
|
objtree: &'a ObjectTree,
|
|
_underlays: &mut Vec<Sprite<'a>>,
|
|
overlays: &mut Vec<Sprite<'a>>,
|
|
_: &bumpalo::Bump,
|
|
) {
|
|
if !atom.istype("/obj/machinery/gravity_generator/main/station/") {
|
|
return;
|
|
}
|
|
|
|
for &(count, icon_state, x, y) in &[
|
|
(1, "on_1", 1, 2),
|
|
(2, "on_2", 0, 2),
|
|
(3, "on_3", -1, 2),
|
|
(4, "on_4", 1, 1),
|
|
(5, "on_5", 0, 1),
|
|
(6, "on_6", -1, 1),
|
|
(7, "on_7", 1, 0),
|
|
(9, "on_9", -1, 0),
|
|
] {
|
|
let mut sprite = Sprite::from_vars(objtree, &objtree.expect("/obj/machinery/gravity_generator/part"));
|
|
sprite.ofs_x += 32 * x;
|
|
sprite.ofs_y += 32 * y;
|
|
sprite.icon_state = icon_state;
|
|
sprite.plane = 0; // TODO: figure out plane handling for real
|
|
if count <= 3 {
|
|
sprite.layer = Layer::from(4.25); // WALL_OBJ_LAYER
|
|
}
|
|
if count == 5 {
|
|
// energy overlay goes above the middle part
|
|
overlays.push(sprite.clone());
|
|
sprite.icon_state = "activated";
|
|
}
|
|
overlays.push(sprite);
|
|
}
|
|
}
|
|
}
|