Browse Source

Added removing belts and pickers

macroquad
Weird Constructor 3 months ago
parent
commit
fb5c7886a8
  1. 15
      src/belt.rs
  2. 77
      src/chemtorio.rs
  3. 34
      src/main.rs

15
src/belt.rs

@ -502,17 +502,15 @@ where
.unwrap_or(false)
}
pub fn remove_belt_at(&mut self, pos: (i32, i32)) -> Option<Vec<Entity>> {
let tile = px2tile_i(pos);
let belt_id = self.get_belt_at_tile(tile).map(|b| b.id())?;
pub fn remove_belt_at_tile(&mut self, tile_pos: (i32, i32)) -> Option<Vec<Entity>> {
let belt_id = self.get_belt_at_tile(tile_pos).map(|b| b.id())?;
let mut belt = self.unmount_belt(belt_id)?;
let mut add_belt = None;
let mut belt_removed = false;
let entities = match belt.remove_tile(tile) {
let entities = match belt.remove_tile(tile_pos) {
BeltSplit::CutMiddle(entities, new_belt) => {
add_belt = Some(new_belt);
entities
@ -537,6 +535,11 @@ where
entities
}
pub fn remove_belt_at(&mut self, pos: (i32, i32)) -> Option<Vec<Entity>> {
let tile_pos = px2tile_i(pos);
self.remove_belt_at_tile(tile_pos)
}
fn unmount_belt(&mut self, belt_id: u64) -> Option<Belt<Entity>> {
let belt = self.belts.remove(&belt_id)?;
belt.iter_tiles(&mut |_, tile_pos| {
@ -711,7 +714,7 @@ where
// println!("ALL PRE: {:?}", self.get_belt_at_tile_mut(tile_pos));
let entities = if let Some(_belt_id) = self.pos2id.get(&tile_pos) {
self.remove_belt_at(pos)
self.remove_belt_at_tile(tile_pos)
} else {
None
};

77
src/chemtorio.rs

@ -208,10 +208,10 @@ impl PickerProbes {
#[derive(Debug, Clone, Copy)]
pub enum EntityTypeTag {
Picker,
Processor,
Source,
Belt,
Picker((i32, i32)),
Processor((i32, i32)),
Source((i32, i32)),
Belt((i32, i32)),
}
#[derive(Debug, Clone, Copy)]
@ -267,9 +267,12 @@ impl PlacedSprites {
}
}
struct BeltMarker();
pub struct Chemtorio {
pub belts: BeltSystem,
world: World,
belt_entity: Entity,
visuals: PlacedSprites,
spatial: TileWorld<Entity>,
@ -282,9 +285,16 @@ pub struct Chemtorio {
impl Chemtorio {
pub fn new() -> Self {
let mut world = World::new();
let mut builder = EntityBuilder::new();
builder.add(BeltMarker());
let belt_entity = world.spawn(builder.build());
Self {
belts: BeltSystem::new(),
world: World::new(),
world,
belt_entity,
visuals: PlacedSprites::new(),
spatial: TileWorld::new(),
@ -382,12 +392,19 @@ impl Chemtorio {
}
pub fn find_entity_at_tile(&self, tile_pos: (i32, i32)) -> Option<(Entity, EntityTypeTag)> {
let ent = self.spatial.get_entity_at(tile_pos, TileLayer::Building)?;
if let Ok(mut query) = self.world.query_one::<&EntityTypeTag>(ent) {
let typtag = query.get()?;
Some((ent, *typtag))
if let Some(ent) = self.spatial.get_entity_at(tile_pos, TileLayer::Building) {
if let Ok(mut query) = self.world.query_one::<&EntityTypeTag>(ent) {
let typtag = query.get()?;
Some((ent, *typtag))
} else {
None
}
} else {
None
if self.belts.is_belt_at(tile_pos) {
Some((self.belt_entity, EntityTypeTag::Belt(tile_pos)))
} else {
None
}
}
}
@ -434,12 +451,38 @@ impl Chemtorio {
true
}
pub fn remove_at(&mut self, pos: (i32, i32)) -> bool {
// if self.spatial.get(pos) ent is picker =>
// self.belts.refresh_belt_at(pos)
// if belt.at(pos)
// remove_belt_at()
false
pub fn remove_at(&mut self, pos: (i32, i32)) -> (bool, Option<Vec<Chem>>) {
if let Some((ent, typtag)) = self.find_entity_at_tile(pos) {
match typtag {
EntityTypeTag::Picker(pos) => {
let mut ents = None;
if let Ok(slots) = self.world.query_one_mut::<&mut InputSlots>(ent) {
ents = Some(vec![Chem::H2O]);
}
self.world.despawn(ent);
self.spatial.remove_entity(ent);
self.visuals.remove(pos);
(true, ents)
},
EntityTypeTag::Belt(pos) => {
let ents = self.belts.belts.remove_belt_at_tile(pos);
(true, ents)
},
EntityTypeTag::Source(pos) => {
// TODO
(true, None)
},
EntityTypeTag::Processor(pos) => {
// TODO
(true, None)
}
}
} else {
(false, None)
}
}
pub fn build_picker_at(&mut self, pos: (i32, i32), dir: Dir) -> bool {
@ -464,7 +507,7 @@ impl Chemtorio {
builder.add(PickerProbes::new(pos_src1, pos_src2, pos_dst));
builder.add(InputSlots::new_accept_one_of_any());
builder.add(FlyingItem::default());
builder.add(EntityTypeTag::Picker);
builder.add(EntityTypeTag::Picker(pos));
builder.add(VisibleFilter {
op_pos: tile2px(pos_op),
item_pos: tile2px(pos_item),

34
src/main.rs

@ -17,7 +17,7 @@ mod transport;
#[allow(dead_code)]
mod util;
use crate::util::Dir;
use crate::util::{tile2px, tile2px_f, Dir};
use chemtorio::{Chem, Chemtorio, EntityTypeTag};
use hecs::Entity;
use inventory::WeightFilter;
@ -29,6 +29,7 @@ enum PlacementMode {
None,
Picker(Dir),
Belt(Dir),
Remove,
}
impl PlacementMode {
@ -37,6 +38,7 @@ impl PlacementMode {
PlacementMode::Belt(dir) => PlacementMode::Belt(dir.rot_l()),
PlacementMode::Picker(dir) => PlacementMode::Picker(dir.rot_l()),
PlacementMode::None => *self,
PlacementMode::Remove => *self,
}
}
@ -45,6 +47,7 @@ impl PlacementMode {
PlacementMode::Belt(dir) => PlacementMode::Belt(dir.rot_r()),
PlacementMode::Picker(dir) => PlacementMode::Picker(dir.rot_r()),
PlacementMode::None => *self,
PlacementMode::Remove => *self,
}
}
}
@ -403,6 +406,10 @@ async fn main() {
if ui.add(imgbtn).clicked() {
placement_mode = PlacementMode::Belt(Dir::R);
}
if ui.button("Delete").clicked() {
placement_mode = PlacementMode::Remove;
}
});
ui.vertical(|ui| {
@ -426,7 +433,7 @@ async fn main() {
if let Some((ent, enttyptag)) = entity_settings {
match enttyptag {
EntityTypeTag::Picker => {
EntityTypeTag::Picker(_pos) => {
egui::Window::new("Picker Settings")
.anchor(egui::Align2::CENTER_CENTER, [200.0, 0.0])
.show(egui_ctx, |ui| {
@ -503,13 +510,13 @@ async fn main() {
});
});
}
EntityTypeTag::Processor => {
EntityTypeTag::Processor(_pos) => {
egui::Window::new("Processor Settings").show(egui_ctx, |ui| {});
}
EntityTypeTag::Source => {
EntityTypeTag::Source(_pos) => {
egui::Window::new("Source Information").show(egui_ctx, |ui| {});
}
EntityTypeTag::Belt => {
EntityTypeTag::Belt(_pos) => {
entity_settings = None;
}
}
@ -600,6 +607,12 @@ async fn main() {
if is_mouse_button_released(MouseButton::Left) {
match placement_mode {
PlacementMode::None => (),
PlacementMode::Remove => {
let (removed, entities) = chemtorio.remove_at(m_tile_pos);
if let Some(entities) = entities {
println!("ENTITIES REMOVED: {:?}", entities);
}
}
PlacementMode::Picker(dir) => {
chemtorio.build_picker_at(m_tile_pos, dir);
}
@ -621,16 +634,16 @@ async fn main() {
m_tile_pos, ent, typtag
);
match typtag {
EntityTypeTag::Picker => {
EntityTypeTag::Picker(_pos) => {
entity_settings = Some((ent, typtag));
}
EntityTypeTag::Processor => {
EntityTypeTag::Processor(_pos) => {
entity_settings = Some((ent, typtag));
}
EntityTypeTag::Source => {
EntityTypeTag::Source(_pos) => {
entity_settings = Some((ent, typtag));
}
EntityTypeTag::Belt => {
EntityTypeTag::Belt(_pos) => {
chemtorio.insert_belt_chem(
(m_pos.x.round() as i32, m_pos.y.round() as i32),
cur_chem,
@ -685,6 +698,9 @@ async fn main() {
match placement_mode {
PlacementMode::None => (),
PlacementMode::Remove => {
qrend.render_debug_tile(40, tile2px(m_tile_pos));
}
PlacementMode::Picker(dir) => {
let sprite = EntitySprite::picker_dir(dir);
qrend.render_entity((m_tile_pos.0 * 32 + 16, m_tile_pos.1 * 32 + 16), &sprite);

Loading…
Cancel
Save