Build menu: traps, doors, steel walls and siege engines; new tools unlock by mission

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-06 08:43:49 +01:00
1 parent d4c2260822
commit 0eebf47530
21 files changed
+30 -22

No files matched your search

+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Kovárna
tool.forge.label = Kovárna tool.forge.label = Kovárna
tool.forge.desc = Tvorové tu vyrábějí pasti a dveře - práce, žádné zlato. Hotové kusy čekají v bednách, dokud je čertík nenainstaluje. Kvůli kovárně od 6 políček přicházejí coglingové. tool.forge.desc = Tvorové tu vyrábějí pasti a dveře - práce, žádné zlato. Hotové kusy čekají v bednách, dokud je čertík nenainstaluje. Kvůli kovárně od 6 políček přicházejí coglingové.
unit.cogling = Cogling unit.cogling = Cogling
cat.traps = Pasti cat.traps = Stavby
cost.work = {0} práce v kovárně cost.work = {0} práce v kovárně
job.forge = Kuje job.forge = Kuje
job.install = Instaluje past job.install = Instaluje past
+1 -1
View File
@@ -883,7 +883,7 @@ room.forge = Smedje
tool.forge.label = Smedje tool.forge.label = Smedje
tool.forge.desc = Væsner fremstiller fælder og døre her - arbejde, intet guld. Færdige stykker venter i kasser, til en imp installerer dem. Tandhjulinger kommer for en smedje på 6+ felter. tool.forge.desc = Væsner fremstiller fælder og døre her - arbejde, intet guld. Færdige stykker venter i kasser, til en imp installerer dem. Tandhjulinger kommer for en smedje på 6+ felter.
unit.cogling = Tandhjuling unit.cogling = Tandhjuling
cat.traps = Fælder cat.traps = Byg
cost.work = {0} arbejde i smedjen cost.work = {0} arbejde i smedjen
job.forge = Smeder job.forge = Smeder
job.install = Installerer en fælde job.install = Installerer en fælde
+1 -1
View File
@@ -883,7 +883,7 @@ room.forge = Schmiede
tool.forge.label = Schmiede tool.forge.label = Schmiede
tool.forge.desc = Kreaturen fertigen hier Fallen und Türen - Arbeit, kein Gold. Fertige Stücke warten in Kisten, bis ein Imp sie einbaut. Coglinge kommen für eine Schmiede ab 6 Feldern. tool.forge.desc = Kreaturen fertigen hier Fallen und Türen - Arbeit, kein Gold. Fertige Stücke warten in Kisten, bis ein Imp sie einbaut. Coglinge kommen für eine Schmiede ab 6 Feldern.
unit.cogling = Cogling unit.cogling = Cogling
cat.traps = Fallen cat.traps = Bauen
cost.work = {0} Arbeit in der Schmiede cost.work = {0} Arbeit in der Schmiede
job.forge = Schmiedet job.forge = Schmiedet
job.install = Baut eine Falle ein job.install = Baut eine Falle ein
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Σιδηρουργείο
tool.forge.label = Σιδηρουργ. tool.forge.label = Σιδηρουργ.
tool.forge.desc = Εδώ τα πλάσματα κατασκευάζουν παγίδες και πόρτες - με δουλειά, όχι χρυσό. Τα έτοιμα κομμάτια περιμένουν σε κιβώτια ώσπου να τα εγκαταστήσει ένα δαιμονάκι. Οι Γραναζάκηδες έρχονται για σιδηρουργείο 6+ πλακιδίων. tool.forge.desc = Εδώ τα πλάσματα κατασκευάζουν παγίδες και πόρτες - με δουλειά, όχι χρυσό. Τα έτοιμα κομμάτια περιμένουν σε κιβώτια ώσπου να τα εγκαταστήσει ένα δαιμονάκι. Οι Γραναζάκηδες έρχονται για σιδηρουργείο 6+ πλακιδίων.
unit.cogling = Γραναζάκης unit.cogling = Γραναζάκης
cat.traps = Παγίδες cat.traps = Κατασκευή
cost.work = {0} δουλειά στο σιδηρουργείο cost.work = {0} δουλειά στο σιδηρουργείο
job.forge = Σφυρηλατεί job.forge = Σφυρηλατεί
job.install = Εγκαθιστά παγίδα job.install = Εγκαθιστά παγίδα
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Forge
tool.forge.label = Forge tool.forge.label = Forge
tool.forge.desc = Creatures manufacture traps and doors here - work, no gold. Finished pieces wait in crates until an imp installs them. Coglings come for a forge of 6+ tiles. tool.forge.desc = Creatures manufacture traps and doors here - work, no gold. Finished pieces wait in crates until an imp installs them. Coglings come for a forge of 6+ tiles.
unit.cogling = Cogling unit.cogling = Cogling
cat.traps = Traps cat.traps = Build
cost.work = {0} work in the forge cost.work = {0} work in the forge
job.forge = Forging job.forge = Forging
job.install = Installing a trap job.install = Installing a trap
+1 -1
View File
@@ -876,7 +876,7 @@ room.forge = Forja
tool.forge.label = Forja tool.forge.label = Forja
tool.forge.desc = Las criaturas fabrican aquí trampas y puertas: trabajo, no oro. Las piezas terminadas esperan en cajas hasta que un diablillo las instala. Con una forja de 6+ casillas vienen engranajillos. tool.forge.desc = Las criaturas fabrican aquí trampas y puertas: trabajo, no oro. Las piezas terminadas esperan en cajas hasta que un diablillo las instala. Con una forja de 6+ casillas vienen engranajillos.
unit.cogling = Engranajillo unit.cogling = Engranajillo
cat.traps = Trampas cat.traps = Construir
cost.work = {0} de trabajo en la forja cost.work = {0} de trabajo en la forja
job.forge = Forjando job.forge = Forjando
job.install = Instalando una trampa job.install = Instalando una trampa
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Paja
tool.forge.label = Paja tool.forge.label = Paja
tool.forge.desc = Olennot valmistavat täällä ansoja ja ovia - työtä, ei kultaa. Valmiit kappaleet odottavat laatikoissa, kunnes piru asentaa ne. Rattaiset tulevat pajaan, jossa on 6+ ruutua. tool.forge.desc = Olennot valmistavat täällä ansoja ja ovia - työtä, ei kultaa. Valmiit kappaleet odottavat laatikoissa, kunnes piru asentaa ne. Rattaiset tulevat pajaan, jossa on 6+ ruutua.
unit.cogling = Rattainen unit.cogling = Rattainen
cat.traps = Ansat cat.traps = Rakenna
cost.work = {0} työtä pajassa cost.work = {0} työtä pajassa
job.forge = Takoo job.forge = Takoo
job.install = Asentaa ansaa job.install = Asentaa ansaa
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Kovačnica
tool.forge.label = Kovačnica tool.forge.label = Kovačnica
tool.forge.desc = Stvorenja ovdje izrađuju zamke i vrata - rad, bez zlata. Gotovi komadi čekaju u sanducima dok ih vražić ne postavi. Zupčići dolaze zbog kovačnice od 6+ polja. tool.forge.desc = Stvorenja ovdje izrađuju zamke i vrata - rad, bez zlata. Gotovi komadi čekaju u sanducima dok ih vražić ne postavi. Zupčići dolaze zbog kovačnice od 6+ polja.
unit.cogling = Zupčić unit.cogling = Zupčić
cat.traps = Zamke cat.traps = Gradnja
cost.work = {0} rada u kovačnici cost.work = {0} rada u kovačnici
job.forge = Kuje job.forge = Kuje
job.install = Postavlja zamku job.install = Postavlja zamku
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Kohó
tool.forge.label = Kohó tool.forge.label = Kohó
tool.forge.desc = Itt gyártanak a lények csapdákat és ajtókat - munkával, arany nélkül. A kész darabok ládákban várnak, amíg egy manó be nem szereli őket. Egy 6+ mezős kohóért fogasmanók jönnek. tool.forge.desc = Itt gyártanak a lények csapdákat és ajtókat - munkával, arany nélkül. A kész darabok ládákban várnak, amíg egy manó be nem szereli őket. Egy 6+ mezős kohóért fogasmanók jönnek.
unit.cogling = Fogasmanó unit.cogling = Fogasmanó
cat.traps = Csapdák cat.traps = Építés
cost.work = {0} munka a kohóban cost.work = {0} munka a kohóban
job.forge = Kovácsol job.forge = Kovácsol
job.install = Csapdát szerel be job.install = Csapdát szerel be
+1 -1
View File
@@ -876,7 +876,7 @@ room.forge = Fucina
tool.forge.label = Fucina tool.forge.label = Fucina
tool.forge.desc = Le creature fabbricano qui trappole e porte - lavoro, niente oro. I pezzi finiti aspettano in casse finché un imp non li installa. Gli Ingranotti vengono per una fucina di 6+ caselle. tool.forge.desc = Le creature fabbricano qui trappole e porte - lavoro, niente oro. I pezzi finiti aspettano in casse finché un imp non li installa. Gli Ingranotti vengono per una fucina di 6+ caselle.
unit.cogling = Ingranotto unit.cogling = Ingranotto
cat.traps = Trappole cat.traps = Costruire
cost.work = {0} di lavoro in fucina cost.work = {0} di lavoro in fucina
job.forge = Forgia job.forge = Forgia
job.install = Installa una trappola job.install = Installa una trappola
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Smederij
tool.forge.label = Smederij tool.forge.label = Smederij
tool.forge.desc = Wezens maken hier vallen en deuren - werk, geen goud. Afgewerkte stukken wachten in kisten tot een imp ze plaatst. Tandwielers komen voor een smederij van 6+ vakken. tool.forge.desc = Wezens maken hier vallen en deuren - werk, geen goud. Afgewerkte stukken wachten in kisten tot een imp ze plaatst. Tandwielers komen voor een smederij van 6+ vakken.
unit.cogling = Tandwieler unit.cogling = Tandwieler
cat.traps = Vallen cat.traps = Bouwen
cost.work = {0} werk in de smederij cost.work = {0} werk in de smederij
job.forge = Smeedt job.forge = Smeedt
job.install = Plaatst een val job.install = Plaatst een val
+1 -1
View File
@@ -883,7 +883,7 @@ room.forge = Smie
tool.forge.label = Smie tool.forge.label = Smie
tool.forge.desc = Skapninger lager feller og dører her - arbeid, ikke gull. Ferdige stykker venter i kasser til en imp installerer dem. Tannhjulinger kommer for en smie på 6+ ruter. tool.forge.desc = Skapninger lager feller og dører her - arbeid, ikke gull. Ferdige stykker venter i kasser til en imp installerer dem. Tannhjulinger kommer for en smie på 6+ ruter.
unit.cogling = Tannhjuling unit.cogling = Tannhjuling
cat.traps = Feller cat.traps = Bygg
cost.work = {0} arbeid i smia cost.work = {0} arbeid i smia
job.forge = Smir job.forge = Smir
job.install = Installerer en felle job.install = Installerer en felle
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Forja
tool.forge.label = Forja tool.forge.label = Forja
tool.forge.desc = As criaturas fabricam aqui armadilhas e portas - trabalho, sem ouro. As peças prontas esperam em caixotes até um diabrete as instalar. Com uma forja de 6+ casas, vêm Engrenitos. tool.forge.desc = As criaturas fabricam aqui armadilhas e portas - trabalho, sem ouro. As peças prontas esperam em caixotes até um diabrete as instalar. Com uma forja de 6+ casas, vêm Engrenitos.
unit.cogling = Engrenito unit.cogling = Engrenito
cat.traps = Armadilhas cat.traps = Construir
cost.work = {0} de trabalho na forja cost.work = {0} de trabalho na forja
job.forge = A forjar job.forge = A forjar
job.install = A instalar uma armadilha job.install = A instalar uma armadilha
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Forjă
tool.forge.label = Forjă tool.forge.label = Forjă
tool.forge.desc = Creaturile fabrică aici capcane și uși - muncă, nu aur. Piesele terminate așteaptă în lăzi până le montează un drăcușor. Rotițarii vin pentru o forjă de 6+ dale. tool.forge.desc = Creaturile fabrică aici capcane și uși - muncă, nu aur. Piesele terminate așteaptă în lăzi până le montează un drăcușor. Rotițarii vin pentru o forjă de 6+ dale.
unit.cogling = Rotițar unit.cogling = Rotițar
cat.traps = Capcane cat.traps = Construcții
cost.work = {0} muncă în forjă cost.work = {0} muncă în forjă
job.forge = Forjează job.forge = Forjează
job.install = Montează o capcană job.install = Montează o capcană
+1 -1
View File
@@ -876,7 +876,7 @@ room.forge = Кузница
tool.forge.label = Кузница tool.forge.label = Кузница
tool.forge.desc = Здесь существа делают ловушки и двери - за работу, не за золото. Готовые изделия ждут в ящиках, пока бесёнок их не установит. На кузницу от 6 клеток приходят шестерёнки. tool.forge.desc = Здесь существа делают ловушки и двери - за работу, не за золото. Готовые изделия ждут в ящиках, пока бесёнок их не установит. На кузницу от 6 клеток приходят шестерёнки.
unit.cogling = Шестерёнок unit.cogling = Шестерёнок
cat.traps = Ловушки cat.traps = Постройки
cost.work = {0} работы в кузнице cost.work = {0} работы в кузнице
job.forge = Куёт job.forge = Куёт
job.install = Ставит ловушку job.install = Ставит ловушку
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Vyhňa
tool.forge.label = Vyhňa tool.forge.label = Vyhňa
tool.forge.desc = Tvory tu vyrábajú pasce a dvere - práca, žiadne zlato. Hotové kusy čakajú v debnách, kým ich čertík nenainštaluje. Kvôli vyhni od 6 políčok prichádzajú coglingovia. tool.forge.desc = Tvory tu vyrábajú pasce a dvere - práca, žiadne zlato. Hotové kusy čakajú v debnách, kým ich čertík nenainštaluje. Kvôli vyhni od 6 políčok prichádzajú coglingovia.
unit.cogling = Cogling unit.cogling = Cogling
cat.traps = Pasce cat.traps = Stavby
cost.work = {0} práce vo vyhni cost.work = {0} práce vo vyhni
job.forge = Kuje job.forge = Kuje
job.install = Inštaluje pascu job.install = Inštaluje pascu
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Ковачница
tool.forge.label = Ковачница tool.forge.label = Ковачница
tool.forge.desc = Створења овде израђују замке и врата - рад, без злата. Готови комади чекају у сандуцима док их ђаволак не постави. Зупчићи долазе због ковачнице од 6+ поља. tool.forge.desc = Створења овде израђују замке и врата - рад, без злата. Готови комади чекају у сандуцима док их ђаволак не постави. Зупчићи долазе због ковачнице од 6+ поља.
unit.cogling = Зупчић unit.cogling = Зупчић
cat.traps = Замке cat.traps = Градња
cost.work = {0} рада у ковачници cost.work = {0} рада у ковачници
job.forge = Кује job.forge = Кује
job.install = Поставља замку job.install = Поставља замку
+1 -1
View File
@@ -884,7 +884,7 @@ room.forge = Smedja
tool.forge.label = Smedja tool.forge.label = Smedja
tool.forge.desc = Varelser tillverkar fällor och dörrar här - arbete, inget guld. Färdiga delar väntar i lådor tills en hob installerar dem. Kugglingar kommer för en smedja på 6+ rutor. tool.forge.desc = Varelser tillverkar fällor och dörrar här - arbete, inget guld. Färdiga delar väntar i lådor tills en hob installerar dem. Kugglingar kommer för en smedja på 6+ rutor.
unit.cogling = Kuggling unit.cogling = Kuggling
cat.traps = Fällor cat.traps = Bygg
cost.work = {0} arbete i smedjan cost.work = {0} arbete i smedjan
job.forge = Smider job.forge = Smider
job.install = Installerar en fälla job.install = Installerar en fälla
+1 -1
View File
@@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize};
// From which mission (0-based) on each tool is available (same order as ui::TOOLS): // From which mission (0-based) on each tool is available (same order as ui::TOOLS):
// dig, hand, treasury, lair, farm, training, library, sell, flag, lightning, heal, imp, // dig, hand, treasury, lair, farm, training, library, sell, flag, lightning, heal, imp,
// torture, temple, arrow tower, cannon tower, magic tower, bridge, aerie, steel // torture, temple, arrow tower, cannon tower, magic tower, bridge, aerie, steel
pub const TOOL_UNLOCK: [usize; 47] = [0, 0, 0, 0, 0, 2, 5, 0, 0, 3, 5, 0, 8, 12, 3, 7, 12, 1, 8, 17, 0, 7, 7, 10, 12, 12, 7, 16, 16, 7, 10, 16, 9, 13, 6, 10, 14, 17, 19, 22, 9, 13, 6, 11, 18, 0, 0]; pub const TOOL_UNLOCK: [usize; crate::ui::TOOLS.len()] = [0, 0, 0, 0, 0, 2, 5, 0, 0, 3, 5, 0, 8, 12, 3, 7, 12, 1, 8, 17, 0, 7, 7, 10, 12, 12, 7, 16, 16, 7, 10, 16, 9, 13, 6, 10, 14, 17, 19, 22, 9, 13, 6, 11, 18, 0, 0, 17, 16, 7, 13, 17];
pub struct FortDef { pub struct FortDef {
pub at: (f32, f32), // centre as a fraction of the map size pub at: (f32, f32), // centre as a fraction of the map size
+8
View File
@@ -207,6 +207,14 @@ mod tests {
assert!(!g.can_research(31), "magic doors are far away"); assert!(!g.can_research(31), "magic doors are far away");
} }
#[test]
fn siege_engines_are_not_known_in_the_first_missions() {
let g = crate::campaign::start_mission(0, None);
for t in [19, 47, 48, 50, 51] {
assert!(!g.tool_allowed(t), "tool {} known in mission 1", t);
}
}
#[test] #[test]
fn once_everything_is_known_the_library_raises_room_levels() { fn once_everything_is_known_the_library_raises_room_levels() {
let mut g = Game::new(9, 64, 64); let mut g = Game::new(9, 64, 64);
+3 -3
View File
@@ -446,9 +446,9 @@ pub const CATS: [(&str, &[usize]); 7] = [
("cat.hand", &[1]), ("cat.hand", &[1]),
("cat.rooms", &[2, 3, 4, 5, 6, 12, 40, 13, 18, 21, 41, 42, 43, 44, 17, 47, 49]), ("cat.rooms", &[2, 3, 4, 5, 6, 12, 40, 13, 18, 21, 41, 42, 43, 44, 17, 47, 49]),
("cat.towers", &[14, 15, 16, 20]), ("cat.towers", &[14, 15, 16, 20]),
("cat.traps", &[22, 23, 24, 25, 26, 27, 28, 29, 30, 31]), ("cat.traps", &[22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 50, 51]),
("cat.spells", &[9, 10, 11, 32, 33, 34, 35, 36, 37, 38, 39, 48]), ("cat.spells", &[9, 10, 11, 32, 33, 34, 35, 36, 37, 38, 39, 48]),
("cat.orders", &[8, 45, 46, 7, 19, 50, 51]), ("cat.orders", &[8, 45, 46, 7]),
]; ];
#[derive(Clone, Copy, PartialEq, Debug)] #[derive(Clone, Copy, PartialEq, Debug)]
@@ -1156,7 +1156,7 @@ impl Ui {
hover_tool = Some(i); hover_tool = Some(i);
} }
let key = if touch_ui() { "" } else { keys[i].as_str() }; let key = if touch_ui() { "" } else { keys[i].as_str() };
let r = tool_button(bx, by, bw, ti.icon, key, &ti.label, self.tool == TOOLS[i], hovered, !g.tool_allowed(i)); let r = tool_button(bx, by, bw, ti.icon, key, &ti.label, self.tool == TOOLS[i], hovered, !g.tool_allowed(i) || (matches!(TOOLS[i], Tool::Siege(_)) && g.forge_tiles() == 0));
self.touch_btns.push((r, TBtn::Tool(i))); self.touch_btns.push((r, TBtn::Tool(i)));
} }
popup_top = py0; popup_top = py0;