aboutsummaryrefslogtreecommitdiff
path: root/server/bot
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-08-12 12:22:46 +0200
committermetamuffin <metamuffin@disroot.org>2024-08-12 12:22:46 +0200
commita2cb371de54a9a1dfb4c469c90c1de3deb1e130d (patch)
treee25c526ec45811a0986284904079687f0419fe31 /server/bot
parent355ba85a62345883fb05609b1075208cc7aae0ea (diff)
downloadhurrycurry-a2cb371de54a9a1dfb4c469c90c1de3deb1e130d.tar
hurrycurry-a2cb371de54a9a1dfb4c469c90c1de3deb1e130d.tar.bz2
hurrycurry-a2cb371de54a9a1dfb4c469c90c1de3deb1e130d.tar.zst
fix some cases where it gets stuck
Diffstat (limited to 'server/bot')
-rw-r--r--server/bot/src/algos/simple.rs56
1 files changed, 35 insertions, 21 deletions
diff --git a/server/bot/src/algos/simple.rs b/server/bot/src/algos/simple.rs
index af02f81e..ba5fd5ff 100644
--- a/server/bot/src/algos/simple.rs
+++ b/server/bot/src/algos/simple.rs
@@ -6,7 +6,7 @@ use hurrycurry_client_lib::Game;
use hurrycurry_protocol::{
glam::IVec2, ItemIndex, Message, PlayerID, Recipe, RecipeIndex, TileIndex,
};
-use log::{info, warn};
+use log::{debug, warn};
#[derive(Default)]
pub struct Simple {
@@ -61,7 +61,7 @@ impl BotAlgo for Simple {
}
.update()
.ok();
- info!("target={:?}", self.path.as_ref().map(|a| a.1));
+ debug!("target={:?}", self.path.as_ref().map(|a| a.1));
BotInput::default()
}
@@ -125,20 +125,25 @@ impl SimpleContext<'_> {
.find(|(_, t)| t.kind == tile)
.map(|(p, _)| *p)
}
- fn find_empty_interactable_tile(&self) -> Option<IVec2> {
- if let Some(t) = self
- .game
+ fn find_empty_interactable_tile_by_name(&self, name: &str) -> Option<IVec2> {
+ self.game
.tiles
.iter()
.find(|(_, t)| {
self.game.data.tile_interact[t.kind.0]
&& t.item.is_none()
- && self.game.data.tile_names[t.kind.0] == "counter"
+ && self.game.data.tile_names[t.kind.0] == name
})
.map(|(p, _)| *p)
- {
+ }
+ fn find_empty_interactable_tile(&self) -> Option<IVec2> {
+ if let Some(t) = self.find_empty_interactable_tile_by_name("counter") {
+ return Some(t);
+ }
+ if let Some(t) = self.find_empty_interactable_tile_by_name("counter-window") {
return Some(t);
}
+ warn!("all counters filled up");
self.game
.tiles
.iter()
@@ -153,7 +158,8 @@ impl SimpleContext<'_> {
.unwrap_or(true)
}
fn clear_tile(&mut self, pos: IVec2) -> LogicRes {
- self.dispose_hand()?;
+ debug!("clear tile {pos}");
+ self.assert_hand_is_clear()?;
self.interact_with(pos, 0.)
}
fn assert_tile_is_clear(&mut self, pos: IVec2) -> LogicRes {
@@ -162,35 +168,40 @@ impl SimpleContext<'_> {
}
Ok(())
}
+ fn assert_hand_is_clear(&mut self) -> LogicRes {
+ if self.is_hand_occupied() {
+ self.dispose_hand()?;
+ }
+ Ok(())
+ }
- pub fn dispose_hand(&mut self) -> LogicRes<IVec2> {
+ pub fn dispose_hand(&mut self) -> LogicRes {
+ debug!("dispose hand");
if let Some(pos) = self.find_empty_interactable_tile() {
- if let Err(()) = self.interact_with(pos, 0.) {
- return Ok(pos);
- } else {
- warn!("no path to empty space ");
- Err(())
- }
+ self.interact_with(pos, 0.)?;
+ warn!("no path to empty space ");
+ Err(())
} else {
warn!("no empty space left");
Err(())
}
}
pub fn aquire_placed_item(&mut self, item: ItemIndex) -> LogicRes<IVec2> {
+ debug!("aquire placed item {:?}", self.game.data.item_names[item.0]);
if let Some(pos) = self.find_item_on_map(item) {
return Ok(pos);
}
self.aquire_item(item)?;
- self.dispose_hand()
+ self.dispose_hand()?;
+ Err(())
}
pub fn aquire_item(&mut self, item: ItemIndex) -> LogicRes {
+ debug!("aquire item {:?}", self.game.data.item_names[item.0]);
if self.is_hand_item(item) {
return Ok(());
}
- if self.is_hand_occupied() {
- self.dispose_hand()?;
- }
if let Some(pos) = self.find_item_on_map(item) {
+ self.assert_hand_is_clear()?;
self.interact_with(pos, 0.)?;
return Ok(());
}
@@ -204,6 +215,7 @@ impl SimpleContext<'_> {
} => {
if let Some(pos) = self.find_tile(*tile) {
self.assert_tile_is_clear(pos)?;
+ self.assert_hand_is_clear()?;
self.interact_with(pos, 0.)?;
}
}
@@ -248,7 +260,8 @@ impl SimpleContext<'_> {
if let Some(pos) = self.find_tile(*tile) {
if let Some(item) = &self.game.tiles.get(&pos).unwrap().item {
if item.kind == *input {
- info!("waiting for passive to finish at {pos}");
+ debug!("waiting for passive to finish at {pos}");
+ self.state.cooldown = 0.5;
return Err(()); // waiting for it to finish
// TODO check progress
}
@@ -261,7 +274,8 @@ impl SimpleContext<'_> {
tile: None, input, ..
} => {
self.aquire_placed_item(*input)?;
- info!("waiting for passive to finish");
+ debug!("waiting for passive to finish");
+ self.state.cooldown = 0.5;
return Err(());
}
_ => warn!("recipe too hard {r:?}"),