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:
1 parent
010a6a8a12
commit
773be21455
5 files changed
+161
-37
No files matched your search
+14
-9
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user