Surface world: grass in daylight, forests, cliffs with cave mouths; free-game and editor option

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-05 22:35:46 +01:00
1 parent ef10b5c432
commit 8a35a903de
32 files changed
+343 -24

No files matched your search

+1 -1
View File
@@ -91,7 +91,7 @@ pub fn coop_campaign() -> CampaignDoc {
waves: sp.waves.0,
wave_limit: sp.waves.1,
first_wave: if sp.waves.0 { sp.waves.2 } else { 300.0 },
gen: GenDoc { rivers: sp.gen.0, lava: sp.gen.1, forts: sp.gen.2, rivals: 0, difficulty: sp.gen.3 },
gen: GenDoc { rivers: sp.gen.0, lava: sp.gen.1, forts: sp.gen.2, rivals: 0, difficulty: sp.gen.3, surface: false },
next: (i + 1 < specs.len()).then(|| format!("c{:02}", i + 2)),
pos: (40.0 + (i % 5) as f32 * 220.0, 40.0 + (i / 5) as f32 * 140.0),
..MissionDoc::default()
+8 -3
View File
@@ -35,7 +35,7 @@ enum Cat {
const CATS: [Cat; 9] = [Cat::Terrain, Cat::Rooms, Cat::Places, Cat::Units, Cat::Towers, Cat::Traps, Cat::Forts, Cat::Zones, Cat::Erase];
const TERRAIN: [&str; 14] = ["floor", "earth", "reinforced", "rock", "water", "lava", "bridge", "lavabridge", "gold", "silver", "ruby", "diamond", "steel", "mushroom"];
const TERRAIN: [&str; 16] = ["floor", "earth", "reinforced", "rock", "water", "lava", "bridge", "lavabridge", "gold", "silver", "ruby", "diamond", "steel", "mushroom", "grass", "tree"];
const PLACES: [&str; 7] = ["core", "portal", "gate", "spring", "shard", "chest", "chained"];
const OWNERS: [Owner; 6] = [Owner::Player, Owner::Hero, Owner::Rival1, Owner::Rival2, Owner::Rival3, Owner::None];
const ZONE_SHAPES: [&str; 4] = ["rect", "circle", "tiles", "line"];
@@ -76,6 +76,8 @@ fn kind_of_terrain(t: &str) -> (Kind, bool) {
"bridge" => (Kind::Bridge, false),
"lavabridge" => (Kind::LavaBridge, false),
"mushroom" => (Kind::Mushroom, false),
"grass" => (Kind::Floor, false),
"tree" => (Kind::Tree, false),
"gold" => (Kind::Gold, false),
"silver" => (Kind::Silver, false),
"ruby" => (Kind::Ruby, false),
@@ -209,7 +211,10 @@ impl MapEdit {
}
match self.cat {
Cat::Terrain => {
let (k, reinforced) = kind_of_terrain(TERRAIN[self.item.min(TERRAIN.len() - 1)]);
let name = TERRAIN[self.item.min(TERRAIN.len() - 1)];
let (k, reinforced) = kind_of_terrain(name);
// grass and trees lie above ground; anything else is painted underground
self.game.map.set_sky(i, matches!(name, "grass" | "tree"));
self.game.torches.retain(|tr| tr.wall != i);
let owner = if k == Kind::Floor || reinforced || matches!(k, Kind::Bridge | Kind::LavaBridge) { OWNERS[self.owner] } else { Owner::None };
let tl = &mut self.game.map.t[i];
@@ -218,7 +223,7 @@ impl MapEdit {
tl.owner = if reinforced && owner == Owner::None { Owner::Player } else { owner };
tl.marked = false;
if tl.plant() {
tl.hp = crate::wood::MUSHROOM_HP;
tl.hp = if k == Kind::Tree { crate::wood::TREE_HP } else { crate::wood::MUSHROOM_HP };
}
tl.gold = match k {
Kind::Gold => 1200,
+2
View File
@@ -777,6 +777,7 @@ impl Editor {
(tr("ed.rivals"), m.gen.rivals.to_string(), 6),
(tr("ed.difficulty"), tr(["diff.0", "diff.1", "diff.2"][m.gen.difficulty.min(2) as usize]), 7),
(tr("ed.portals"), m.portals.to_string(), 8),
(tr("ed.surface"), tr(if m.gen.surface { "val.on" } else { "val.off" }), 9),
];
if fixed {
rows.truncate(0);
@@ -794,6 +795,7 @@ impl Editor {
5 => m.gen.forts = (m.gen.forts as i32 + d.signum()).clamp(0, 3) as u8,
6 => m.gen.rivals = (m.gen.rivals as i32 + d.signum()).clamp(0, 2) as u8,
7 => m.gen.difficulty = (m.gen.difficulty as i32 + d.signum()).clamp(0, 2) as u8,
9 => m.gen.surface = !m.gen.surface,
_ => m.portals = (m.portals as i32 + d.signum()).clamp(0, 6) as usize,
}
}
+2 -2
View File
@@ -93,7 +93,7 @@ pub fn demo_campaign() -> CampaignDoc {
seed: 4242,
gold: 4000.0,
goals: vec!["Towers".into()],
gen: GenDoc { rivers: 1, lava: 0, forts: 1, rivals: 0, difficulty: 0 },
gen: GenDoc { rivers: 1, lava: 0, forts: 1, rivals: 0, difficulty: 0, surface: false },
next: Some("demo2".into()),
branches: vec![BranchDoc { id: "rich".into(), goal: "Loot(2000)".into(), title: tr("demo.branch"), next: "demo2".into(), priority: Some(1) }],
pos: (40.0, 60.0),
@@ -226,7 +226,7 @@ pub fn demo_campaign() -> CampaignDoc {
seed: 77,
gold: 3000.0,
goals: vec!["KillAll".into()],
gen: GenDoc { rivers: 1, lava: 1, forts: 1, rivals: 0, difficulty: 0 },
gen: GenDoc { rivers: 1, lava: 1, forts: 1, rivals: 0, difficulty: 0, surface: false },
pos: (300.0, 60.0),
..MissionDoc::default()
};