Marks and dig selection in each master's colour; imps dig only their master's marks; AI marks near its ground, acts calmer, re-summons imps; allies never claim each other's ground

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-06 09:21:42 +01:00
1 parent 010a6a8a12
commit 773be21455
5 files changed
+161 -37

No files matched your search

+14 -9
View File
@@ -3269,12 +3269,13 @@ impl Game {
// ---------------------------------------------------------------- pit imps (workers)
fn dig_neighbor(&self, i: usize, me: u32) -> Option<usize> {
// a neighbour of tile i that this imp may dig: marked by its own master (side)
fn dig_neighbor(&self, i: usize, me: u32, side: u8) -> Option<usize> {
let (x, y) = xy(i);
let mut found = None;
for &(dx, dy) in &DIR4 {
if let Some(t) = self.map.get(x + dx, y + dy) {
if t.marked && t.diggable() {
if t.marked && t.mark_by == side && t.diggable() {
if t.reserved == me {
return Some(idx(x + dx, y + dy));
}
@@ -3312,14 +3313,16 @@ impl Game {
None
}
fn claimable(&self, i: usize, me: u32) -> bool {
pub(crate) fn claimable(&self, i: usize, me: u32) -> bool {
let t = &self.map.t[i];
let ok = if t.owner == self.me {
false
} else if t.owner == Owner::None {
matches!(t.kind, Kind::Floor | Kind::Portal | Kind::Bridge | Kind::LavaBridge | Kind::Shard | Kind::Treasury | Kind::ManaSpring | Kind::RuneChest)
} else if t.owner != Owner::Hero && self.allied(self.me_side, t.owner.side()) {
false // an ally's ground is never taken
} else {
// knight and other masters' ground (also vaults and shard chambers), but not while enemies fight there
// knight and enemy masters' ground (also vaults and shard chambers), but not while enemies fight there
matches!(t.kind, Kind::Floor | Kind::Treasury | Kind::Bridge | Kind::LavaBridge | Kind::Shard | Kind::Lair | Kind::Training) && !self.contested.get(i).copied().unwrap_or(false)
};
if !ok {
@@ -3412,7 +3415,7 @@ impl Game {
match e.job {
Job::Dig(t) => {
let tile = self.map.t[t];
if !tile.marked || !tile.diggable() || !adj4(cur, t) {
if !tile.marked || tile.mark_by != e.side || !tile.diggable() || !adj4(cur, t) {
self.unreserve(me);
e.job = Job::None;
return;
@@ -3647,9 +3650,9 @@ impl Game {
return;
}
}
if let Some(p) = self.map.search(cur, self.map.walk_cost(), |i| self.dig_neighbor(i, me).is_some(), true) {
if let Some(p) = self.map.search(cur, self.map.walk_cost(), |i| self.dig_neighbor(i, me, e.side).is_some(), true) {
let end = p.last().copied().unwrap_or(cur);
if let Some(t) = self.dig_neighbor(end, me) {
if let Some(t) = self.dig_neighbor(end, me, e.side) {
self.map.t[t].reserved = me;
e.path = p;
e.job = Job::Dig(t);
@@ -4851,9 +4854,11 @@ impl Game {
for x in x0.min(x1)..=x0.max(x1) {
if inb(x, y) {
let t = &mut self.map.t[idx(x, y)];
if t.diggable() {
// a master sets and clears only his own marks
let side = self.me.side().min(7);
if t.diggable() && (!t.marked || t.mark_by == side) {
t.marked = on;
t.mark_by = self.me.side().min(7);
t.mark_by = side;
}
}
}