Drawbridges (down, up, automatic), frost spell and obsidian over cooled lava

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-05 21:52:12 +01:00
1 parent 76c23a06f0
commit 34b4640d85
32 files changed
+869 -31

No files matched your search

+22 -7
View File
@@ -750,6 +750,8 @@ pub const ROOM_NAMES: [&str; N_ROOMS] = [
// bridge cost per tile: over water, over lava
pub const BRIDGE_COST: [i32; 2] = [30, 75];
// a drawbridge tile (over water or lava)
pub const DRAWBRIDGE_COST: i32 = 150;
// steel wall cost per tile: from earth, from a reinforced wall
pub const STEEL_COST: [i32; 2] = [80, 40];
pub const STEEL_HP: f32 = 40.0;
@@ -2820,7 +2822,7 @@ impl Game {
// the ground of tile i turned into river (bridge removed): units on it fall in
pub(crate) fn ground_lost(&mut self, i: usize) {
let lava = self.map.t[i].kind == Kind::Lava;
let lava = self.map.t[i].river() == Some(Kind::Lava);
let (x, y) = xy(i);
for j in 0..self.ents.len() {
let e = &self.ents[j];
@@ -2890,6 +2892,10 @@ impl Game {
}
pub fn build_bridges(&mut self, x0: i32, y0: i32, x1: i32, y1: i32) {
self.build_bridges_of(x0, y0, x1, y1, false);
}
pub fn build_bridges_of(&mut self, x0: i32, y0: i32, x1: i32, y1: i32, draw: bool) {
let (mut built, mut broke, mut any_river) = (0, false, false);
loop {
let mut add = Vec::new();
@@ -2911,14 +2917,21 @@ impl Game {
let mut progress = false;
for i in add {
let lava = self.map.t[i].kind == Kind::Lava;
let cost = BRIDGE_COST[lava as usize] as f32;
let cost = if draw { DRAWBRIDGE_COST } else { BRIDGE_COST[lava as usize] } as f32;
if self.gold < cost {
broke = true;
continue;
}
self.gold -= cost;
let t = &mut self.map.t[i];
t.kind = if lava { Kind::LavaBridge } else { Kind::Bridge };
t.kind = if draw {
Kind::Drawbridge
} else if lava {
Kind::LavaBridge
} else {
Kind::Bridge
};
t.res = if draw && lava { DB_LAVA } else { 0 };
t.owner = self.me;
built += 1;
progress = true;
@@ -3060,7 +3073,7 @@ impl Game {
continue;
}
if let Some(t) = self.map.get(cx + dx, cy + dy) {
if t.bridge() && t.owner == self.me {
if t.bridge() && !t.raised() && t.owner == self.me {
return Some(idx(cx + dx, cy + dy));
}
}
@@ -3073,7 +3086,7 @@ impl Game {
// a knight walks next to the bridge tile and tears it down
fn tear_bridge(&mut self, e: &mut Ent, i: usize, dt: f32) -> bool {
let t = self.map.t[i];
if !t.bridge() || t.owner != self.me {
if !t.bridge() || t.raised() || t.owner != self.me {
return false;
}
let (bx, by) = xy(i);
@@ -4714,11 +4727,13 @@ impl Game {
continue;
}
if t.owner == self.me && t.bridge() {
let lava = t.kind == Kind::LavaBridge;
let lava = t.river() == Some(Kind::Lava);
let cost = if t.kind == Kind::Drawbridge { DRAWBRIDGE_COST } else { BRIDGE_COST[lava as usize] };
t.kind = if lava { Kind::Lava } else { Kind::Water };
t.owner = Owner::None;
t.reserved = 0;
refund += BRIDGE_COST[lava as usize] as f32 * 0.5;
t.res = 0;
refund += cost as f32 * 0.5;
self.ground_lost(i);
continue;
}