aboutsummaryrefslogtreecommitdiff
path: root/server/src/interaction.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-23 19:51:08 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-23 19:51:08 +0200
commit44a431aca295af333ede40eeed8115ed15bed222 (patch)
tree28f345df4d69a021188f780ad641de3944de9236 /server/src/interaction.rs
parentb972ea72c09a81187ad2e4f55711da6f8e9fdaff (diff)
downloadhurrycurry-44a431aca295af333ede40eeed8115ed15bed222.tar
hurrycurry-44a431aca295af333ede40eeed8115ed15bed222.tar.bz2
hurrycurry-44a431aca295af333ede40eeed8115ed15bed222.tar.zst
reapply reverting recipes
Diffstat (limited to 'server/src/interaction.rs')
-rw-r--r--server/src/interaction.rs53
1 files changed, 32 insertions, 21 deletions
diff --git a/server/src/interaction.rs b/server/src/interaction.rs
index 126026d6..938ab715 100644
--- a/server/src/interaction.rs
+++ b/server/src/interaction.rs
@@ -27,6 +27,7 @@ use serde::{Deserialize, Serialize};
pub enum Recipe {
Passive {
duration: f32,
+ revert_duration: Option<f32>,
tile: Option<TileIndex>,
input: ItemIndex,
output: Option<ItemIndex>,
@@ -60,6 +61,14 @@ impl Recipe {
_ => None,
}
}
+ pub fn revert_duration(&self) -> Option<f32> {
+ match self {
+ Recipe::Passive {
+ revert_duration, ..
+ } => *revert_duration,
+ _ => None,
+ }
+ }
pub fn warn(&self) -> bool {
match self {
Recipe::Passive { warn, .. } => *warn,
@@ -222,30 +231,32 @@ pub fn tick_tile(dt: f32, data: &Gamedata, tile: &mut Tile) -> Option<TickEffect
let r = &data.recipe(a.recipe);
if r.supports_tile(tile.kind) {
a.progress += a.working as f32 * dt / r.duration().unwrap();
- if a.progress >= 1. {
- if let Recipe::Passive { output, .. } = &data.recipe(a.recipe) {
- tile.item = output.map(|kind| Item { kind, active: None });
- return Some(TickEffect::Produce);
- };
- a.progress = 1.;
- }
- return Some(TickEffect::Progress(r.warn()));
+ } else if let Some(revert_duration) = r.revert_duration() {
+ a.progress -= dt / revert_duration;
+ }
+ if a.progress >= 1. {
+ if let Recipe::Passive { output, .. } = &data.recipe(a.recipe) {
+ tile.item = output.map(|kind| Item { kind, active: None });
+ return Some(TickEffect::Produce);
+ };
+ a.progress = 1.;
}
+ if a.progress < 0. {
+ item.active = None;
+ }
+ return Some(TickEffect::Progress(r.warn()));
} else {
for (ri, recipe) in data.recipes() {
- if let Some(tile_constraint) = recipe.tile() {
- if tile.kind != tile_constraint {
- continue;
- }
- }
- if let Recipe::Passive { input, .. } = recipe {
- if *input == item.kind {
- item.active = Some(Involvement {
- recipe: ri,
- progress: 0.,
- working: 1,
- });
- return Some(TickEffect::Progress(recipe.warn()));
+ if recipe.supports_tile(tile.kind) {
+ if let Recipe::Passive { input, .. } = recipe {
+ if *input == item.kind {
+ item.active = Some(Involvement {
+ recipe: ri,
+ progress: 0.,
+ working: 1,
+ });
+ return Some(TickEffect::Progress(recipe.warn()));
+ }
}
}
}