diff --git a/crates/logic/src/battle/logic_pathfinder.rs b/crates/logic/src/battle/logic_pathfinder.rs index d07f6f8..0c4e99a 100644 --- a/crates/logic/src/battle/logic_pathfinder.rs +++ b/crates/logic/src/battle/logic_pathfinder.rs @@ -36,7 +36,10 @@ pub fn find_path( ) -> Vec<(i32, i32)> { let start = (tile_of(from.0), tile_of(from.1)); let goal = (tile_of(to.0), tile_of(to.1)); - if start == goal || !tilemap.is_inside(goal.0, goal.1) { + if start == goal + || !tilemap.is_inside(start.0, start.1) + || !tilemap.is_inside(goal.0, goal.1) + { return Vec::new(); } let width = tilemap.width().max(1) as usize; diff --git a/crates/logic/src/battle/logic_simulation.rs b/crates/logic/src/battle/logic_simulation.rs index 59c6e15..5ad0377 100644 --- a/crates/logic/src/battle/logic_simulation.rs +++ b/crates/logic/src/battle/logic_simulation.rs @@ -2,6 +2,7 @@ use crate::battle::logic_battle::LogicBattle; use crate::battle::logic_component::{LogicComponent, COMPONENT_COMBAT, COMPONENT_HITPOINT}; use crate::battle::logic_game_object::{LogicGameObjectEntry, LogicObjectBody}; use crate::battle::logic_battle::BATTLE_TICKS_PER_SECOND; +use crate::battle::logic_tilemap::SUBTILE_UNITS; use crate::data::LogicDataRef; pub const TICK_MILLISECONDS: i32 = 50; pub const MANA_ACCUMULATOR_STEP: i32 = 5000; @@ -426,9 +427,14 @@ impl LogicBattle { if push.2 == 0 { continue; } + let (limit_x, limit_y) = self + .tilemap + .as_ref() + .map(|map| (map.width() * SUBTILE_UNITS - 1, map.height() * SUBTILE_UNITS - 1)) + .unwrap_or((i32::MAX, i32::MAX)); let base = self.objects.objects[index].body.base_mut(); - base.position.x += (push.0 / push.2 as i64) as i32; - base.position.y += (push.1 / push.2 as i64) as i32; + base.position.x = (base.position.x + (push.0 / push.2 as i64) as i32).clamp(0, limit_x); + base.position.y = (base.position.y + (push.1 / push.2 as i64) as i32).clamp(0, limit_y); } } fn resolve_attacks(&mut self) {