From 34b4640d8585b0bdedef7b9163ef40f304a3bc95 Mon Sep 17 00:00:00 2001 From: Richard Zink Date: Thu, 5 Nov 2026 21:52:12 +0100 Subject: [PATCH] Drawbridges (down, up, automatic), frost spell and obsidian over cooled lava Co-Authored-By: Claude Opus 5.5 --- docs/ROADMAP.md | 7 +- lang/cs.lang | 20 ++++ lang/da.lang | 20 ++++ lang/de.lang | 20 ++++ lang/el.lang | 20 ++++ lang/en.lang | 20 ++++ lang/es.lang | 20 ++++ lang/fi.lang | 20 ++++ lang/hr.lang | 20 ++++ lang/hu.lang | 20 ++++ lang/it.lang | 20 ++++ lang/nl.lang | 20 ++++ lang/no.lang | 20 ++++ lang/pt.lang | 20 ++++ lang/ro.lang | 20 ++++ lang/ru.lang | 20 ++++ lang/sk.lang | 20 ++++ lang/sr.lang | 20 ++++ lang/sv.lang | 20 ++++ src/bridges.rs | 236 ++++++++++++++++++++++++++++++++++++++++++- src/commands.rs | 4 +- src/game.rs | 29 ++++-- src/gfx.rs | 54 +++++++++- src/main.rs | 7 +- src/map.rs | 37 ++++++- src/menu/bestiary.rs | 3 +- src/render3d.rs | 55 +++++++++- src/research.rs | 2 + src/scenes.rs | 27 +++++ src/spells.rs | 31 +++++- src/traps.rs | 3 +- src/ui.rs | 45 ++++++++- 32 files changed, 869 insertions(+), 31 deletions(-) diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index c7616ab..4c33449 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -3,7 +3,7 @@ Agreed on 2026-11-05. Worked through in this order; every block is committed, pushed and deployed on its own. Details not listed here are decided along the way. -## 1. Open items +## 1. Open items – done (v202611-00035) 1. **Heroes attack every master** – with rival masters or several players, each hero wave marches to the heart of the *strongest* living master (most creatures and gold), not only the player's. @@ -14,7 +14,7 @@ on its own. Details not listed here are decided along the way. the reached mission; the host keeps the progress. 4. **New screenshots** – title demo, language dropdown, co-op campaign. -## 2. Bridges +## 2. Bridges – done (v202611-00036) Stone bridges over lava exist already (75 gold per tile). @@ -27,6 +27,9 @@ Stone bridges over lava exist already (75 gold per tile). 4. **Repairing bridges** – imps repair damaged bridges; knights wear bridges down step by step instead of in one blow. +Built as: `src/bridges.rs` (fire, wear, drawbridges, obsidian), the *Drawbridge* tool (click: down → up → +automatic) and the *Frost* spell (lava → obsidian for 40 s); the frost glow trap keeps lava next to it cooled. + ## 3. The surface world 1. **Surface terrain** – grass, trees, paths, daylight and sky. Trees act like earth: imps fell diff --git a/lang/cs.lang b/lang/cs.lang index 97ea63b..df04649 100644 --- a/lang/cs.lang +++ b/lang/cs.lang @@ -399,6 +399,9 @@ help.start_touch = Klepni pro start tool.bridge.label = Most tool.bridge.name = Postavit most tool.bridge.desc = Postaví most přes vodu nebo lávu. Táhni z vlastní země přes řeku; most roste políčko po políčku od tvého území. +tool.drawbridge.label = Padací most +tool.drawbridge.name = Postavit padací most +tool.drawbridge.desc = Most, který můžeš vytáhnout: táhni přes řeku a postav ho, kliknutím přepínáš: dole, nahoře, automaticky (zvedne se, když se blíží nepřátelé). Dřevo nad vodou hoří, kámen nad lávou ne. cost.bridge = {0} zlata/políčko přes vodu, {1} přes lávu hint.bridge_where = Mosty musí začínat na tvé zemi: táhni ze svého území přes řeku. hint.bridge_fire = Dřevěné mosty hoří: drž ohnivé pasti, ohnivý dech a blesky dál od nich – kamenné mosty nad lávou nehoří. @@ -411,6 +414,15 @@ tile.lava = Láva tile.lava_info = Co do ní spadne, shoří. Přecházejí ji kamenné mosty. tile.bridge = Dřevěný most tile.lavabridge = Kamenný most +tile.drawbridge = Padací most +tile.drawbridge_up = Vytažený +tile.drawbridge_down = Spuštěný +tile.drawbridge_auto = Automaticky (dole) +tile.drawbridge_auto_up = Automaticky (nahoře) +tile.obsidian = Obsidián +tile.obsidian_info = Ztuhlá láva – roztaje za {0} s +tile.bridge_burning = Hoří! +tile.bridge_worn = Poškozený {0}% tile.shard = Střep tvého jádra duše tile.shard_info = Zaber tuto komnatu a získáš střep zpět. @@ -433,6 +445,10 @@ msg.vault_taken = Rytířský trezor dobyt: poklad v hodnotě {0} je tvůj. msg.shard_taken = Střep tvého jádra duše je zpět v tvých rukou! msg.bridge_torn = Rytíři strhli jeden z tvých mostů! msg.bridge_fire = Jeden z tvých mostů hoří! +msg.drawbridge_up = Padací most je vytažený. +msg.drawbridge_down = Padací most je spuštěný. +msg.drawbridge_auto = Padací most se sám zvedne, když se blíží nepřátelé. +msg.drawbridge_rises = Blíží se nepřátelé: padací most se zvedá! job.tear_bridge = Strhává most job.patrol = Na hlídce job.guard = Na stráži @@ -804,6 +820,7 @@ best.b.torture.text = Sem končí zajatí hrdinové. S časem a žalářníkem n best.b.temple.text = Modlitby léčí jádro duše a drží dobrou náladu. Kvůli chrámu přichází plamenná kněžka. best.b.aerie.text = Bidla a hnízda pro létající tvory. Netopýři, chrliči, sovy i žhavý drak tu potřebují místo. best.b.bridge.text = Dřevo přes vodu, kámen přes lávu. Rytíři tvé mosty strhávají - zaber ty jejich. +best.b.drawbridge.text = Vytažený most dělá z řeky opět zeď. V automatickém režimu se zvedne, když se blíží nepřátelé – a spustí se pro tvé bytosti. best.b.steel.text = Nýtované železné pláty na zpevněné zdi. Nikdo se rychle neprokope, ani trpaslíci. best.b.arrow.text = Šíp prolétne až dvěma dalšími nepřáteli za cílem. Levná a spolehlivá. best.b.cannon.text = Plošné poškození a odhození - natlač rytíře do lávy. @@ -929,6 +946,9 @@ tool.plague.desc = Nemoc, která užírá nepřátele kolem místa a přeskakuje tool.quake.label = Otřes tool.quake.name = Zemětřesení tool.quake.desc = Země se otřese: nepřátelé kolem místa jsou zraněni a na dvě sekundy omráčeni. Tví tvorové se udrží na nohou. +tool.freeze.label = Mráz +tool.freeze.name = Mráz +tool.freeze.desc = Ledová zima: láva kolem místa na 40 sekund ztuhne v průchozí obsidián, nepřátelé jsou podchlazení a zpomalení. tile.unexplored = Neprozkoumaná temnota # personality diff --git a/lang/da.lang b/lang/da.lang index 1aa7854..d9ea900 100644 --- a/lang/da.lang +++ b/lang/da.lang @@ -398,6 +398,9 @@ help.start_touch = Tryk for at starte tool.bridge.label = Bro tool.bridge.name = Byg bro tool.bridge.desc = Bygger en bro over vand eller lava. Træk fra din egen jord hen over floden; broen vokser felt for felt fra dit område. +tool.drawbridge.label = Vindebro +tool.drawbridge.name = Byg vindebro +tool.drawbridge.desc = En bro du kan hejse op: træk over floden for at bygge den, klik for at skifte: nede, oppe, automatisk (hejses når fjender nærmer sig). Træ over vand brænder, sten over lava gør ikke. cost.bridge = {0} guld/felt over vand, {1} over lava hint.bridge_where = Broer skal starte på din egen jord: træk fra dit område hen over floden. hint.bridge_fire = Træbroer brænder: hold ildfælder, ildånde og lyn væk fra dem – stenbroer over lava er brandsikre. @@ -410,6 +413,15 @@ tile.lava = Lava tile.lava_info = Hvad der falder i, brænder. Stenbroer fører over. tile.bridge = Træbro tile.lavabridge = Stenbro +tile.drawbridge = Vindebro +tile.drawbridge_up = Hejst op +tile.drawbridge_down = Sænket +tile.drawbridge_auto = Automatisk (nede) +tile.drawbridge_auto_up = Automatisk (oppe) +tile.obsidian = Obsidian +tile.obsidian_info = Afkølet lava – smelter om {0} s +tile.bridge_burning = Brænder! +tile.bridge_worn = Beskadiget {0}% tile.shard = Splint af din sjælekerne tile.shard_info = Indtag dette kammer for at tage splinten tilbage. @@ -432,6 +444,10 @@ msg.vault_taken = Riddernes boks indtaget: skatte til en værdi af {0} er dine. msg.shard_taken = En splint af din sjælekerne er tilbage i dine hænder! msg.bridge_torn = Ridderne har revet en af dine broer ned! msg.bridge_fire = En af dine broer brænder! +msg.drawbridge_up = Vindebroen er hejst op. +msg.drawbridge_down = Vindebroen er sænket. +msg.drawbridge_auto = Vindebroen hejses af sig selv, når fjender nærmer sig. +msg.drawbridge_rises = Fjender nærmer sig: en vindebro hejses! job.tear_bridge = River en bro ned job.patrol = På patrulje job.guard = På vagt @@ -803,6 +819,7 @@ best.b.torture.text = Tilfangetagne helte ender her. Med tid og en fangevogter s best.b.temple.text = Bønner heler sjælekernen og holder humøret oppe. Flammepræstinden kommer for et tempel. best.b.aerie.text = Siddepinde og reder til flyvende væsner. Flagermus, gargoyler, ugler og selv glødelindormen skal have plads her. best.b.bridge.text = Træ over vand, sten over lava. Ridderne river dine broer ned - indtag deres. +best.b.drawbridge.text = Hejst op er floden igen en mur. På automatisk hejses den, når fjender nærmer sig – og sænkes for dine egne væsner. best.b.steel.text = Nittede jernplader på en forstærket mur. Ingen graver sig hurtigt igennem, ikke engang dværge. best.b.arrow.text = Pilen gennemborer op til to fjender mere bag målet. Billigt og pålideligt. best.b.cannon.text = Områdeskade og tilbageslag - skub ridderne i lavaen. @@ -928,6 +945,9 @@ tool.plague.desc = En sygdom, der æder fjenderne omkring stedet og springer fra tool.quake.label = Skælv tool.quake.name = Jordskælv tool.quake.desc = Jorden ryster: fjender omkring stedet såres og lammes i to sekunder. Dine væsner holder balancen. +tool.freeze.label = Frost +tool.freeze.name = Frost +tool.freeze.desc = Isnende kulde: lava omkring stedet køles til farbar obsidian i 40 sekunder, fjender bliver nedkølet og langsomme. tile.unexplored = Uudforsket mørke # personality diff --git a/lang/de.lang b/lang/de.lang index 06d6025..bc86274 100644 --- a/lang/de.lang +++ b/lang/de.lang @@ -398,6 +398,9 @@ help.start_touch = Tippen zum Starten tool.bridge.label = Brücke tool.bridge.name = Brücke bauen tool.bridge.desc = Baut eine Brücke über Wasser oder Lava. Ziehe von deinem Gebiet aus über den Fluss; die Brücke wächst Feld für Feld von deinem Reich aus. +tool.drawbridge.label = Zugbrücke +tool.drawbridge.name = Zugbrücke bauen +tool.drawbridge.desc = Eine Brücke, die du hochziehen kannst: Ziehe über den Fluss, um sie zu bauen, klicke sie an zum Umschalten: unten, oben, automatisch (hebt sich, wenn Feinde nahen). Holz über Wasser brennt, Stein über Lava nicht. cost.bridge = {0} Gold/Feld über Wasser, {1} über Lava hint.bridge_where = Brücken müssen an deinem Gebiet beginnen: Ziehe von deinem Reich aus über den Fluss. hint.bridge_fire = Holzbrücken brennen: Halte Feuerfallen, Feueratem und Blitze von ihnen fern – Steinbrücken über Lava sind feuerfest. @@ -410,6 +413,15 @@ tile.lava = Lava tile.lava_info = Was hineinfällt, verbrennt. Steinbrücken führen hinüber. tile.bridge = Holzbrücke tile.lavabridge = Steinbrücke +tile.drawbridge = Zugbrücke +tile.drawbridge_up = Hochgezogen +tile.drawbridge_down = Herabgelassen +tile.drawbridge_auto = Automatisch (unten) +tile.drawbridge_auto_up = Automatisch (oben) +tile.obsidian = Obsidian +tile.obsidian_info = Erkaltete Lava – schmilzt in {0} s wieder +tile.bridge_burning = Brennt! +tile.bridge_worn = Beschädigt {0}% tile.shard = Splitter deines Seelenkerns tile.shard_info = Erobere diese Kammer, um den Splitter zurückzuholen. @@ -432,6 +444,10 @@ msg.vault_taken = Ritterschatz erobert: Schätze im Wert von {0} gehören dir. msg.shard_taken = Ein Splitter deines Seelenkerns ist wieder in deiner Hand! msg.bridge_torn = Die Ritter haben eine deiner Brücken eingerissen! msg.bridge_fire = Eine deiner Brücken brennt! +msg.drawbridge_up = Die Zugbrücke ist hochgezogen. +msg.drawbridge_down = Die Zugbrücke ist herabgelassen. +msg.drawbridge_auto = Die Zugbrücke hebt sich von selbst, wenn Feinde nahen. +msg.drawbridge_rises = Feinde nahen: Eine Zugbrücke hebt sich! job.tear_bridge = Reißt eine Brücke ein job.patrol = Auf Patrouille job.guard = Hält Wache @@ -803,6 +819,7 @@ best.b.torture.text = Gefangene Helden landen hier. Mit der Zeit und einem Kerke best.b.temple.text = Gebete heilen den Seelenkern und heben die Stimmung. Die Flammenpriesterin kommt für einen Tempel. best.b.aerie.text = Sitzstangen und Nester für Flieger. Fledermäuse, Gargoyles, Eulen und sogar der Glutlindwurm brauchen hier Platz. best.b.bridge.text = Holz über Wasser, Stein über Lava. Die Ritter reißen deine Brücken ein - nimm dir ihre. +best.b.drawbridge.text = Hochgezogen ist der Fluss wieder eine Mauer. Auf Automatik hebt sie sich, sobald Feinde nahen – und senkt sich für deine eigenen Kreaturen. best.b.steel.text = Genietete Eisenplatten auf einer verstärkten Mauer. Da gräbt sich keiner schnell durch, nicht einmal Zwerge. best.b.arrow.text = Der Pfeil durchbohrt bis zu zwei weitere Feinde hinter dem Ziel. Billig und zuverlässig. best.b.cannon.text = Flächenschaden und Rückstoß - schieb die Ritter in die Lava. @@ -928,6 +945,9 @@ tool.plague.desc = Eine Krankheit, die an den Feinden rund um die Stelle zehrt u tool.quake.label = Beben tool.quake.name = Beben tool.quake.desc = Der Boden bebt: Feinde rund um die Stelle werden verletzt und zwei Sekunden betäubt. Deine Kreaturen bleiben standfest. +tool.freeze.label = Frost +tool.freeze.name = Frost +tool.freeze.desc = Eisige Kälte: Lava rund um die Stelle erkaltet für 40 Sekunden zu begehbarem Obsidian, Feinde werden unterkühlt und verlangsamt. tile.unexplored = Unerforschte Finsternis # personality diff --git a/lang/el.lang b/lang/el.lang index 6e018fc..9ec07ff 100644 --- a/lang/el.lang +++ b/lang/el.lang @@ -399,6 +399,9 @@ help.start_touch = Πάτησε για αρχή tool.bridge.label = Γέφυρα tool.bridge.name = Χτίσιμο Γέφυρας tool.bridge.desc = Χτίζει γέφυρα πάνω από νερό ή λάβα. Σύρε από το δικό σου έδαφος πέρα από το ποτάμι, η γέφυρα μεγαλώνει πλακίδιο-πλακίδιο από την επικράτειά σου. +tool.drawbridge.label = Κινητή γέφυρα +tool.drawbridge.name = Χτίσε κινητή γέφυρα +tool.drawbridge.desc = Γέφυρα που μπορείς να σηκώσεις: σύρε πάνω από το ποτάμι για να τη χτίσεις, κάνε κλικ για αλλαγή: κάτω, πάνω, αυτόματα (σηκώνεται όταν πλησιάζουν εχθροί). Το ξύλο πάνω από νερό καίγεται, η πέτρα πάνω από λάβα όχι. cost.bridge = {0} χρυσός/πλακίδιο πάνω από νερό, {1} πάνω από λάβα hint.bridge_where = Οι γέφυρες ξεκινούν από το δικό σου έδαφος: σύρε από την επικράτειά σου πέρα από το ποτάμι. hint.bridge_fire = Οι ξύλινες γέφυρες καίγονται: κράτα μακριά παγίδες φωτιάς, πύρινη ανάσα και κεραυνούς – οι πέτρινες γέφυρες πάνω από λάβα δεν καίγονται. @@ -411,6 +414,15 @@ tile.lava = Λάβα tile.lava_info = Ό,τι πέφτει μέσα καίγεται. Οι πέτρινες γέφυρες την περνούν. tile.bridge = Ξύλινη γέφυρα tile.lavabridge = Πέτρινη γέφυρα +tile.drawbridge = Κινητή γέφυρα +tile.drawbridge_up = Σηκωμένη +tile.drawbridge_down = Κατεβασμένη +tile.drawbridge_auto = Αυτόματα (κάτω) +tile.drawbridge_auto_up = Αυτόματα (πάνω) +tile.obsidian = Οψιδιανός +tile.obsidian_info = Κρυωμένη λάβα – λιώνει σε {0} δ +tile.bridge_burning = Καίγεται! +tile.bridge_worn = Φθορά {0}% tile.shard = Θραύσμα του πυρήνα ψυχής σου tile.shard_info = Κατάκτησε αυτόν τον θάλαμο για να πάρεις πίσω το θραύσμα. @@ -433,6 +445,10 @@ msg.vault_taken = Ιπποτικό θησαυροφυλάκιο κατελήφθ msg.shard_taken = Ένα θραύσμα του πυρήνα ψυχής σου είναι ξανά στα χέρια σου! msg.bridge_torn = Οι ιππότες γκρέμισαν μία από τις γέφυρές σου! msg.bridge_fire = Μια από τις γέφυρές σου καίγεται! +msg.drawbridge_up = Η κινητή γέφυρα είναι σηκωμένη. +msg.drawbridge_down = Η κινητή γέφυρα είναι κατεβασμένη. +msg.drawbridge_auto = Η κινητή γέφυρα σηκώνεται μόνη της όταν πλησιάζουν εχθροί. +msg.drawbridge_rises = Εχθροί κοντά: μια κινητή γέφυρα σηκώνεται! job.tear_bridge = Γκρεμίζει γέφυρα job.patrol = Σε περιπολία job.guard = Σε φρουρά @@ -804,6 +820,7 @@ best.b.torture.text = Εδώ καταλήγουν οι αιχμάλωτοι ήρ best.b.temple.text = Οι προσευχές γιατρεύουν τον πυρήνα ψυχής και κρατούν ψηλά το ηθικό. Η ιέρεια της φλόγας έρχεται για έναν ναό. best.b.aerie.text = Κούρνιες και φωλιές για ιπτάμενα πλάσματα. Νυχτερίδες, γκάργκοϊλ, κουκουβάγιες, ακόμη και ο δράκος της θράκας χρειάζονται χώρο εδώ. best.b.bridge.text = Ξύλο πάνω από νερό, πέτρα πάνω από λάβα. Οι ιππότες γκρεμίζουν τις γέφυρές σου - κατάκτησε τις δικές τους. +best.b.drawbridge.text = Σηκωμένη, το ποτάμι γίνεται ξανά τείχος. Στο αυτόματο σηκώνεται όταν πλησιάζουν εχθροί – και κατεβαίνει για τα δικά σου πλάσματα. best.b.steel.text = Καρφωμένες σιδερένιες πλάκες πάνω σε ενισχυμένο τοίχο. Κανείς δεν σκάβει γρήγορα από μέσα, ούτε καν οι νάνοι. best.b.arrow.text = Το βέλος διαπερνά έως δύο ακόμη εχθρούς πίσω από τον στόχο. Φθηνός και αξιόπιστος. best.b.cannon.text = Ζημιά περιοχής και απώθηση - σπρώξε τους ιππότες στη λάβα. @@ -929,6 +946,9 @@ tool.plague.desc = Μια αρρώστια που κατατρώει τους ε tool.quake.label = Σεισμός tool.quake.name = Σεισμός tool.quake.desc = Η γη σείεται: οι εχθροί γύρω από το σημείο πληγώνονται και ζαλίζονται για δύο δευτερόλεπτα. Τα πλάσματά σου μένουν όρθια. +tool.freeze.label = Παγετός +tool.freeze.name = Παγετός +tool.freeze.desc = Παγωμένο κρύο: η λάβα γύρω από το σημείο κρυώνει σε βατό οψιδιανό για 40 δευτερόλεπτα, οι εχθροί παγώνουν και επιβραδύνονται. tile.unexplored = Ανεξερεύνητο σκοτάδι # personality diff --git a/lang/en.lang b/lang/en.lang index b6a0787..83f46b1 100644 --- a/lang/en.lang +++ b/lang/en.lang @@ -399,6 +399,9 @@ help.start_touch = Tap to start tool.bridge.label = Bridge tool.bridge.name = Build Bridge tool.bridge.desc = Builds a bridge over water or lava. Drag from your own ground across the river; the bridge grows tile by tile from your territory. +tool.drawbridge.label = Drawbridge +tool.drawbridge.name = Build Drawbridge +tool.drawbridge.desc = A bridge you can raise: drag across the river to build it, click it to switch: down, up, automatic (rises when enemies come near). Wood over water burns, stone over lava does not. cost.bridge = {0} gold/tile over water, {1} over lava hint.bridge_where = Bridges must start at your own ground: drag from your territory across the river. hint.bridge_fire = Wooden bridges burn: keep fire traps, fire breath and lightning away from them – stone bridges over lava are fireproof. @@ -411,6 +414,15 @@ tile.lava = Lava tile.lava_info = Whatever falls in burns. Stone bridges cross it. tile.bridge = Wooden bridge tile.lavabridge = Stone bridge +tile.drawbridge = Drawbridge +tile.drawbridge_up = Raised +tile.drawbridge_down = Lowered +tile.drawbridge_auto = Automatic (down) +tile.drawbridge_auto_up = Automatic (up) +tile.obsidian = Obsidian +tile.obsidian_info = Cooled lava – melts again in {0} s +tile.bridge_burning = Burning! +tile.bridge_worn = Worn {0}% tile.shard = Shard of your soul core tile.shard_info = Claim this chamber to take the shard back. @@ -433,6 +445,10 @@ msg.vault_taken = Knight vault taken: {0} worth of treasure is yours. msg.shard_taken = A shard of your soul core is back in your hands! msg.bridge_torn = The knights have torn down one of your bridges! msg.bridge_fire = One of your bridges is on fire! +msg.drawbridge_up = The drawbridge is raised. +msg.drawbridge_down = The drawbridge is lowered. +msg.drawbridge_auto = The drawbridge rises by itself when enemies come near. +msg.drawbridge_rises = Enemies near: a drawbridge rises! job.tear_bridge = Tearing down a bridge job.patrol = On patrol job.guard = On guard @@ -804,6 +820,7 @@ best.b.torture.text = Captured heroes end up here. With time and a jailer, some best.b.temple.text = Prayers heal the soul core and keep spirits high. The flame priestess comes for a temple. best.b.aerie.text = Perches and nests for flying creatures. Bats, gargoyles, owls and even the ember wyrm need room here. best.b.bridge.text = Wood over water, stone over lava. The knights tear down your bridges - claim theirs. +best.b.drawbridge.text = Pull it up and the river is a wall again. Set to automatic, it rises whenever enemies come close – and comes down for your own creatures. best.b.steel.text = Riveted iron plates on a reinforced wall. Nobody digs through quickly, not even dwarves. best.b.arrow.text = The arrow pierces up to two more enemies behind the target. Cheap and reliable. best.b.cannon.text = Splash damage and knockback - push the knights into the lava. @@ -929,6 +946,9 @@ tool.plague.desc = A sickness that eats at the enemies around the spot and jumps tool.quake.label = Quake tool.quake.name = Quake tool.quake.desc = The ground shakes: enemies around the spot are hurt and stunned for two seconds. Your creatures keep their footing. +tool.freeze.label = Frost +tool.freeze.name = Frost +tool.freeze.desc = Icy cold: lava around the spot cools into walkable obsidian for 40 seconds, enemies are chilled and slowed. tile.unexplored = Unexplored darkness # personality diff --git a/lang/es.lang b/lang/es.lang index 719f0a1..eb00f3d 100644 --- a/lang/es.lang +++ b/lang/es.lang @@ -399,6 +399,9 @@ help.start_touch = Toca para empezar tool.bridge.label = Puente tool.bridge.name = Construir puente tool.bridge.desc = Construye un puente sobre agua o lava. Arrastra desde tu propio suelo a través del río; el puente crece casilla a casilla desde tu territorio. +tool.drawbridge.label = Levadizo +tool.drawbridge.name = Construir puente levadizo +tool.drawbridge.desc = Un puente que puedes alzar: arrástralo sobre el río para construirlo y haz clic para cambiar: abajo, arriba, automático (se alza cuando se acercan enemigos). La madera sobre agua arde, la piedra sobre lava no. cost.bridge = {0} de oro/casilla sobre agua, {1} sobre lava hint.bridge_where = Los puentes deben empezar en tu propio suelo: arrastra desde tu territorio a través del río. hint.bridge_fire = Los puentes de madera arden: aleja de ellos las trampas de fuego, el aliento de fuego y los rayos; los puentes de piedra sobre lava son ignífugos. @@ -411,6 +414,15 @@ tile.lava = Lava tile.lava_info = Lo que cae dentro arde. Los puentes de piedra lo cruzan. tile.bridge = Puente de madera tile.lavabridge = Puente de piedra +tile.drawbridge = Puente levadizo +tile.drawbridge_up = Alzado +tile.drawbridge_down = Bajado +tile.drawbridge_auto = Automático (abajo) +tile.drawbridge_auto_up = Automático (arriba) +tile.obsidian = Obsidiana +tile.obsidian_info = Lava enfriada: se funde en {0} s +tile.bridge_burning = ¡Arde! +tile.bridge_worn = Dañado {0}% tile.shard = Fragmento de tu núcleo de alma tile.shard_info = Reclama esta cámara para recuperar el fragmento. @@ -433,6 +445,10 @@ msg.vault_taken = Cámara acorazada tomada: {0} en tesoros son tuyos. msg.shard_taken = ¡Un fragmento de tu núcleo de alma vuelve a estar en tus manos! msg.bridge_torn = ¡Los caballeros han derribado uno de tus puentes! msg.bridge_fire = ¡Uno de tus puentes está en llamas! +msg.drawbridge_up = El puente levadizo está alzado. +msg.drawbridge_down = El puente levadizo está bajado. +msg.drawbridge_auto = El puente levadizo se alza solo cuando se acercan enemigos. +msg.drawbridge_rises = ¡Se acercan enemigos: un puente levadizo se alza! job.tear_bridge = Derribando un puente job.patrol = De patrulla job.guard = De guardia @@ -796,6 +812,7 @@ best.b.torture.text = Los héroes capturados acaban aquí. Con tiempo y un carce best.b.temple.text = Las oraciones curan el núcleo de alma y mantienen alta la moral. La sacerdotisa de llamas viene por un templo. best.b.aerie.text = Perchas y nidos para criaturas voladoras. Murciélagos, gárgolas, búhos e incluso el dragón de brasas necesitan sitio aquí. best.b.bridge.text = Madera sobre agua, piedra sobre lava. Los caballeros derriban tus puentes: reclama los suyos. +best.b.drawbridge.text = Álzalo y el río vuelve a ser un muro. En automático se alza cuando se acercan enemigos y baja para tus criaturas. best.b.steel.text = Placas de hierro remachadas sobre un muro reforzado. Nadie lo atraviesa rápido, ni siquiera los enanos. best.b.arrow.text = La flecha atraviesa hasta dos enemigos más detrás del objetivo. Barata y fiable. best.b.cannon.text = Daño en área y retroceso: empuja a los caballeros a la lava. @@ -921,6 +938,9 @@ tool.plague.desc = Una enfermedad que corroe a los enemigos alrededor del punto tool.quake.label = Temblor tool.quake.name = Terremoto tool.quake.desc = La tierra tiembla: los enemigos alrededor del punto sufren daño y quedan aturdidos dos segundos. Tus criaturas no pierden el equilibrio. +tool.freeze.label = Escarcha +tool.freeze.name = Escarcha +tool.freeze.desc = Frío glacial: la lava alrededor se enfría en obsidiana transitable durante 40 segundos; los enemigos quedan helados y ralentizados. tile.unexplored = Oscuridad inexplorada # personality diff --git a/lang/fi.lang b/lang/fi.lang index 22bdb80..1b04aae 100644 --- a/lang/fi.lang +++ b/lang/fi.lang @@ -399,6 +399,9 @@ help.start_touch = Napauta aloittaaksesi tool.bridge.label = Silta tool.bridge.name = Rakenna silta tool.bridge.desc = Rakentaa sillan veden tai laavan yli. Vedä omalta maaltasi joen yli; silta kasvaa ruutu kerrallaan alueeltasi. +tool.drawbridge.label = Laskusilta +tool.drawbridge.name = Rakenna laskusilta +tool.drawbridge.desc = Silta, jonka voit nostaa: vedä joen yli rakentaaksesi, napsauta vaihtaaksesi: alhaalla, ylhäällä, automaattinen (nousee vihollisten lähestyessä). Puu veden yllä palaa, kivi laavan yllä ei. cost.bridge = {0} kultaa/ruutu veden yli, {1} laavan yli hint.bridge_where = Siltojen on alettava omalta maaltasi: vedä alueeltasi joen yli. hint.bridge_fire = Puusillat palavat: pidä tuliansat, tulihenkäys ja salamat loitolla – kivisillat laavan yllä eivät pala. @@ -411,6 +414,15 @@ tile.lava = Laava tile.lava_info = Mikä sinne putoaa, se palaa. Kivisillat ylittävät sen. tile.bridge = Puusilta tile.lavabridge = Kivisilta +tile.drawbridge = Laskusilta +tile.drawbridge_up = Nostettu +tile.drawbridge_down = Laskettu +tile.drawbridge_auto = Automaattinen (alhaalla) +tile.drawbridge_auto_up = Automaattinen (ylhäällä) +tile.obsidian = Obsidiaani +tile.obsidian_info = Jäähtynyt laava – sulaa {0} s kuluttua +tile.bridge_burning = Palaa! +tile.bridge_worn = Vaurioitunut {0}% tile.shard = Sieluytimesi siru tile.shard_info = Valtaa tämä kammio saadaksesi sirun takaisin. @@ -433,6 +445,10 @@ msg.vault_taken = Ritarien holvi vallattu: aarteita arvoltaan {0} on nyt sinun. msg.shard_taken = Sieluytimesi siru on taas käsissäsi! msg.bridge_torn = Ritarit ovat purkaneet yhden silloistasi! msg.bridge_fire = Yksi silloistasi palaa! +msg.drawbridge_up = Laskusilta on nostettu. +msg.drawbridge_down = Laskusilta on laskettu. +msg.drawbridge_auto = Laskusilta nousee itsestään vihollisten lähestyessä. +msg.drawbridge_rises = Vihollisia lähellä: laskusilta nousee! job.tear_bridge = Purkaa siltaa job.patrol = Partiossa job.guard = Vartiossa @@ -804,6 +820,7 @@ best.b.torture.text = Vangitut sankarit päätyvät tänne. Ajan ja vanginvartij best.b.temple.text = Rukoukset parantavat sieluydintä ja pitävät mielialan korkealla. Liekkipapitar tulee temppeliin. best.b.aerie.text = Orsia ja pesiä lentäville olennoille. Lepakot, gargoilit, pöllöt ja jopa hehkulohikäärme tarvitsevat täällä tilaa. best.b.bridge.text = Puuta veden yli, kiveä laavan yli. Ritarit purkavat siltasi - valtaa heidän siltansa. +best.b.drawbridge.text = Nostettuna joki on taas muuri. Automaattisena se nousee vihollisten lähestyessä – ja laskeutuu omille olennoillesi. best.b.steel.text = Niitattuja rautalevyjä vahvistetulla seinällä. Kukaan ei kaiva läpi nopeasti, eivät edes kääpiöt. best.b.arrow.text = Nuoli lävistää vielä kaksi vihollista kohteen takana. Halpa ja luotettava. best.b.cannon.text = Roiskevahinkoa ja takaisku - tönäise ritarit laavaan. @@ -929,6 +946,9 @@ tool.plague.desc = Tauti, joka kalvaa kohdan ympärillä olevia vihollisia ja hy tool.quake.label = Järistys tool.quake.name = Järistys tool.quake.desc = Maa järisee: kohdan ympärillä olevat viholliset loukkaantuvat ja huumautuvat kahdeksi sekunniksi. Olentosi pysyvät jaloillaan. +tool.freeze.label = Pakkanen +tool.freeze.name = Pakkanen +tool.freeze.desc = Jäätävä kylmyys: laava kohdan ympärillä jäähtyy 40 sekunniksi kuljettavaksi obsidiaaniksi, viholliset jäähtyvät ja hidastuvat. tile.unexplored = Tutkimaton pimeys # personality diff --git a/lang/hr.lang b/lang/hr.lang index 31311f7..f24374d 100644 --- a/lang/hr.lang +++ b/lang/hr.lang @@ -399,6 +399,9 @@ help.start_touch = Dodirni za početak tool.bridge.label = Most tool.bridge.name = Gradnja mosta tool.bridge.desc = Gradi most preko vode ili lave. Povuci sa svog tla preko rijeke; most raste polje po polje od tvog teritorija. +tool.drawbridge.label = Pokretni most +tool.drawbridge.name = Izgradi pokretni most +tool.drawbridge.desc = Most koji možeš podići: povuci preko rijeke da ga izgradiš, klikni za promjenu: dolje, gore, automatski (diže se kad se neprijatelji približe). Drvo nad vodom gori, kamen nad lavom ne. cost.bridge = {0} zlata/polje preko vode, {1} preko lave hint.bridge_where = Mostovi moraju početi na tvom tlu: povuci sa svog teritorija preko rijeke. hint.bridge_fire = Drveni mostovi gore: drži vatrene zamke, vatreni dah i munje podalje – kameni mostovi nad lavom ne gore. @@ -411,6 +414,15 @@ tile.lava = Lava tile.lava_info = Što god upadne, izgori. Kameni mostovi je premošćuju. tile.bridge = Drveni most tile.lavabridge = Kameni most +tile.drawbridge = Pokretni most +tile.drawbridge_up = Podignut +tile.drawbridge_down = Spušten +tile.drawbridge_auto = Automatski (dolje) +tile.drawbridge_auto_up = Automatski (gore) +tile.obsidian = Opsidijan +tile.obsidian_info = Ohlađena lava – topi se za {0} s +tile.bridge_burning = Gori! +tile.bridge_worn = Oštećen {0}% tile.shard = Krhotina tvoje jezgre duše tile.shard_info = Osvoji ovu odaju da vratiš krhotinu. @@ -433,6 +445,10 @@ msg.vault_taken = Viteški trezor osvojen: blago vrijedno {0} je tvoje. msg.shard_taken = Krhotina tvoje jezgre duše opet je u tvojim rukama! msg.bridge_torn = Vitezovi su srušili jedan od tvojih mostova! msg.bridge_fire = Jedan od tvojih mostova gori! +msg.drawbridge_up = Pokretni most je podignut. +msg.drawbridge_down = Pokretni most je spušten. +msg.drawbridge_auto = Pokretni most se sam diže kad se neprijatelji približe. +msg.drawbridge_rises = Neprijatelji blizu: pokretni most se diže! job.tear_bridge = Ruši most job.patrol = U ophodnji job.guard = Na straži @@ -804,6 +820,7 @@ best.b.torture.text = Zarobljeni junaci završe ovdje. S vremenom i tamničarom best.b.temple.text = Molitve liječe jezgru duše i drže duh visoko. Svećenica plamena dolazi zbog hrama. best.b.aerie.text = Prečke i gnijezda za leteća stvorenja. Šišmišima, gargojlima, sovama, pa i žarnom zmaju ovdje treba mjesta. best.b.bridge.text = Drvo preko vode, kamen preko lave. Vitezovi ruše tvoje mostove - osvoji njihove. +best.b.drawbridge.text = Podignut, rijeka je opet zid. Na automatskom se diže kad se neprijatelji približe – i spušta za tvoja stvorenja. best.b.steel.text = Zakovane željezne ploče na ojačanom zidu. Nitko se ne prokopa brzo, čak ni patuljci. best.b.arrow.text = Strijela probija do dva neprijatelja iza mete. Jeftino i pouzdano. best.b.cannon.text = Šteta u području i odbacivanje - gurni vitezove u lavu. @@ -929,6 +946,9 @@ tool.plague.desc = Bolest koja izjeda neprijatelje oko mjesta i preskače s jedn tool.quake.label = Potres tool.quake.name = Potres tool.quake.desc = Tlo se trese: neprijatelji oko mjesta ozlijeđeni su i omamljeni dvije sekunde. Tvoja stvorenja ostaju na nogama. +tool.freeze.label = Mraz +tool.freeze.name = Mraz +tool.freeze.desc = Ledena hladnoća: lava oko mjesta se na 40 sekundi hladi u prohodni opsidijan, neprijatelji se smrzavaju i usporavaju. tile.unexplored = Neistražena tama # personality diff --git a/lang/hu.lang b/lang/hu.lang index 0b31d21..0cf922d 100644 --- a/lang/hu.lang +++ b/lang/hu.lang @@ -399,6 +399,9 @@ help.start_touch = Koppints az indításhoz tool.bridge.label = Híd tool.bridge.name = Hídépítés tool.bridge.desc = Hidat épít víz vagy láva fölé. Húzd a saját földedről a folyón át; a híd mezőről mezőre nő a területedről. +tool.drawbridge.label = Felvonóhíd +tool.drawbridge.name = Felvonóhíd építése +tool.drawbridge.desc = Felhúzható híd: húzd át a folyón az építéshez, kattints rá a váltáshoz: lent, fent, automatikus (felemelkedik, ha ellenség közeledik). A víz feletti fa ég, a láva feletti kő nem. cost.bridge = {0} arany/mező víz fölött, {1} láva fölött hint.bridge_where = A hídnak a saját földedről kell indulnia: húzd a területedről a folyón át. hint.bridge_fire = A fahidak égnek: tartsd távol tőlük a tűzcsapdákat, a tűzleheletet és a villámokat – a láva feletti kőhidak tűzállók. @@ -411,6 +414,15 @@ tile.lava = Láva tile.lava_info = Ami beleesik, elég. Kőhidak vezetnek át rajta. tile.bridge = Fahíd tile.lavabridge = Kőhíd +tile.drawbridge = Felvonóhíd +tile.drawbridge_up = Felhúzva +tile.drawbridge_down = Leeresztve +tile.drawbridge_auto = Automatikus (lent) +tile.drawbridge_auto_up = Automatikus (fent) +tile.obsidian = Obszidián +tile.obsidian_info = Kihűlt láva – {0} mp múlva megolvad +tile.bridge_burning = Ég! +tile.bridge_worn = Sérült {0}% tile.shard = A Lélekmagod egyik szilánkja tile.shard_info = Foglald el ezt a kamrát, hogy visszaszerezd a szilánkot. @@ -433,6 +445,10 @@ msg.vault_taken = Lovagi kincstár elfoglalva: {0} értékű kincs a tiéd. msg.shard_taken = A Lélekmagod egyik szilánkja újra a kezedben van! msg.bridge_torn = A lovagok lerombolták az egyik hidadat! msg.bridge_fire = Az egyik hidad lángokban áll! +msg.drawbridge_up = A felvonóhíd fel van húzva. +msg.drawbridge_down = A felvonóhíd le van eresztve. +msg.drawbridge_auto = A felvonóhíd magától felemelkedik, ha ellenség közeledik. +msg.drawbridge_rises = Ellenség közeledik: egy felvonóhíd felemelkedik! job.tear_bridge = Hidat rombol job.patrol = Járőrözik job.guard = Őrt áll @@ -804,6 +820,7 @@ best.b.torture.text = Ide kerülnek a foglyul ejtett hősök. Idővel és egy b best.b.temple.text = Az imák gyógyítják a lélekmagot, és jó hangulatban tartanak. A templomért a lángpapnő jön. best.b.aerie.text = Ülőrudak és fészkek repülő lényeknek. A denevéreknek, vízköpőknek, baglyoknak, sőt a parázssárkánynak is itt kell hely. best.b.bridge.text = Fa a víz fölött, kő a láva fölött. A lovagok lerombolják a hidaidat - foglald el az övéiket. +best.b.drawbridge.text = Felhúzva a folyó újra fal. Automatikus módban felemelkedik, ha ellenség közeledik – és leereszkedik a saját lényeidnek. best.b.steel.text = Szegecselt vaslemezek egy megerősített falon. Senki sem ás át rajta gyorsan, még a törpék sem. best.b.arrow.text = A nyíl a célpont mögött még legfeljebb két ellenségen áthatol. Olcsó és megbízható. best.b.cannon.text = Területi sebzés és hátralökés - lökd a lovagokat a lávába. @@ -929,6 +946,9 @@ tool.plague.desc = Kór, amely a hely körüli ellenségeket emészti, és egyik tool.quake.label = Rengés tool.quake.name = Földrengés tool.quake.desc = Megremeg a föld: a hely körüli ellenségek megsérülnek, és két másodpercre elkábulnak. A lényeid talpon maradnak. +tool.freeze.label = Fagy +tool.freeze.name = Fagy +tool.freeze.desc = Jeges hideg: a láva a hely körül 40 másodpercre járható obszidiánná hűl, az ellenségek átfagynak és lelassulnak. tile.unexplored = Feltáratlan sötétség # personality diff --git a/lang/it.lang b/lang/it.lang index e9cb9a7..ba711f2 100644 --- a/lang/it.lang +++ b/lang/it.lang @@ -399,6 +399,9 @@ help.start_touch = Tocca per iniziare tool.bridge.label = Ponte tool.bridge.name = Costruisci ponte tool.bridge.desc = Costruisce un ponte su acqua o lava. Trascina dal tuo suolo attraverso il fiume; il ponte cresce casella per casella dal tuo territorio. +tool.drawbridge.label = Levatoio +tool.drawbridge.name = Costruisci ponte levatoio +tool.drawbridge.desc = Un ponte che puoi sollevare: trascina sul fiume per costruirlo, clicca per cambiare: giù, su, automatico (si alza quando arrivano nemici). Il legno sull'acqua brucia, la pietra sulla lava no. cost.bridge = {0} oro/casella sull'acqua, {1} sulla lava hint.bridge_where = I ponti devono partire dal tuo suolo: trascina dal tuo territorio attraverso il fiume. hint.bridge_fire = I ponti di legno bruciano: tieni lontani trappole di fuoco, soffio infuocato e fulmini; i ponti di pietra sulla lava sono ignifughi. @@ -411,6 +414,15 @@ tile.lava = Lava tile.lava_info = Ciò che ci cade brucia. I ponti di pietra la attraversano. tile.bridge = Ponte di legno tile.lavabridge = Ponte di pietra +tile.drawbridge = Ponte levatoio +tile.drawbridge_up = Sollevato +tile.drawbridge_down = Abbassato +tile.drawbridge_auto = Automatico (giù) +tile.drawbridge_auto_up = Automatico (su) +tile.obsidian = Ossidiana +tile.obsidian_info = Lava raffreddata: si scioglie tra {0} s +tile.bridge_burning = Brucia! +tile.bridge_worn = Danneggiato {0}% tile.shard = Frammento del tuo nucleo tile.shard_info = Conquista questa camera per riprenderti il frammento. @@ -433,6 +445,10 @@ msg.vault_taken = Caveau dei cavalieri preso: tesori per {0} sono tuoi. msg.shard_taken = Un frammento del tuo nucleo è di nuovo nelle tue mani! msg.bridge_torn = I cavalieri hanno abbattuto uno dei tuoi ponti! msg.bridge_fire = Uno dei tuoi ponti è in fiamme! +msg.drawbridge_up = Il ponte levatoio è sollevato. +msg.drawbridge_down = Il ponte levatoio è abbassato. +msg.drawbridge_auto = Il ponte levatoio si alza da solo quando arrivano nemici. +msg.drawbridge_rises = Arrivano nemici: un ponte levatoio si alza! job.tear_bridge = Abbatte un ponte job.patrol = Di pattuglia job.guard = Di guardia @@ -796,6 +812,7 @@ best.b.torture.text = Gli eroi catturati finiscono qui. Con il tempo e un carcer best.b.temple.text = Le preghiere curano il nucleo dell'anima e tengono alto il morale. La sacerdotessa della fiamma viene per un tempio. best.b.aerie.text = Posatoi e nidi per creature volanti. Pipistrelli, gargoyle, gufi e perfino il drago di brace hanno bisogno di spazio qui. best.b.bridge.text = Legno sull'acqua, pietra sulla lava. I cavalieri abbattono i tuoi ponti - conquista i loro. +best.b.drawbridge.text = Sollevato, il fiume torna a essere un muro. In automatico si alza quando arrivano nemici e si abbassa per le tue creature. best.b.steel.text = Piastre di ferro rivettate su un muro rinforzato. Nessuno ci scava attraverso in fretta, nemmeno i nani. best.b.arrow.text = La freccia trapassa fino a due nemici dietro il bersaglio. Economica e affidabile. best.b.cannon.text = Danno ad area e contraccolpo - spingi i cavalieri nella lava. @@ -921,6 +938,9 @@ tool.plague.desc = Una malattia che divora i nemici intorno al punto e salta dal tool.quake.label = Sisma tool.quake.name = Terremoto tool.quake.desc = La terra trema: i nemici intorno al punto vengono feriti e storditi per due secondi. Le tue creature restano in piedi. +tool.freeze.label = Gelo +tool.freeze.name = Gelo +tool.freeze.desc = Freddo glaciale: la lava intorno si raffredda in ossidiana calpestabile per 40 secondi, i nemici vengono gelati e rallentati. tile.unexplored = Oscurità inesplorata # personality diff --git a/lang/nl.lang b/lang/nl.lang index ab6ee89..2aabc80 100644 --- a/lang/nl.lang +++ b/lang/nl.lang @@ -399,6 +399,9 @@ help.start_touch = Tik om te beginnen tool.bridge.label = Brug tool.bridge.name = Brug bouwen tool.bridge.desc = Bouwt een brug over water of lava. Sleep vanaf je eigen grond over de rivier; de brug groeit vak voor vak vanuit je gebied. +tool.drawbridge.label = Ophaalbrug +tool.drawbridge.name = Ophaalbrug bouwen +tool.drawbridge.desc = Een brug die je kunt ophalen: sleep over de rivier om hem te bouwen, klik om te wisselen: omlaag, omhoog, automatisch (gaat omhoog als vijanden naderen). Hout boven water brandt, steen boven lava niet. cost.bridge = {0} goud/vak over water, {1} over lava hint.bridge_where = Bruggen moeten op je eigen grond beginnen: sleep vanuit je gebied over de rivier. hint.bridge_fire = Houten bruggen branden: houd vuurvallen, vuuradem en bliksem uit de buurt – stenen bruggen over lava zijn vuurvast. @@ -411,6 +414,15 @@ tile.lava = Lava tile.lava_info = Wat erin valt, verbrandt. Stenen bruggen gaan eroverheen. tile.bridge = Houten brug tile.lavabridge = Stenen brug +tile.drawbridge = Ophaalbrug +tile.drawbridge_up = Opgehaald +tile.drawbridge_down = Neergelaten +tile.drawbridge_auto = Automatisch (omlaag) +tile.drawbridge_auto_up = Automatisch (omhoog) +tile.obsidian = Obsidiaan +tile.obsidian_info = Afgekoelde lava – smelt over {0} s +tile.bridge_burning = Brandt! +tile.bridge_worn = Beschadigd {0}% tile.shard = Scherf van je zielenkern tile.shard_info = Neem deze kamer in om de scherf terug te halen. @@ -433,6 +445,10 @@ msg.vault_taken = Riddergewelf ingenomen: schatten ter waarde van {0} zijn van j msg.shard_taken = Een scherf van je zielenkern is weer in jouw handen! msg.bridge_torn = De ridders hebben een van je bruggen afgebroken! msg.bridge_fire = Een van je bruggen staat in brand! +msg.drawbridge_up = De ophaalbrug is opgehaald. +msg.drawbridge_down = De ophaalbrug is neergelaten. +msg.drawbridge_auto = De ophaalbrug gaat vanzelf omhoog als vijanden naderen. +msg.drawbridge_rises = Vijanden naderen: een ophaalbrug gaat omhoog! job.tear_bridge = Breekt een brug af job.patrol = Op patrouille job.guard = Op wacht @@ -804,6 +820,7 @@ best.b.torture.text = Gevangen helden belanden hier. Met tijd en een cipier lope best.b.temple.text = Gebeden genezen de zielenkern en houden de moed erin. De vlampriesteres komt voor een tempel. best.b.aerie.text = Zitstokken en nesten voor vliegende wezens. Vleermuizen, gargouilles, uilen en zelfs de gloeddraak hebben hier ruimte nodig. best.b.bridge.text = Hout over water, steen over lava. De ridders breken je bruggen af - neem de hunne in. +best.b.drawbridge.text = Opgehaald is de rivier weer een muur. Op automatisch gaat hij omhoog zodra vijanden naderen – en zakt voor je eigen wezens. best.b.steel.text = Geklonken ijzeren platen op een versterkte muur. Niemand graaft er snel doorheen, zelfs dwergen niet. best.b.arrow.text = De pijl doorboort tot twee extra vijanden achter het doelwit. Goedkoop en betrouwbaar. best.b.cannon.text = Spatschade en terugslag - duw de ridders de lava in. @@ -929,6 +946,9 @@ tool.plague.desc = Een ziekte die de vijanden rond de plek aanvreet en van de ee tool.quake.label = Beving tool.quake.name = Aardbeving tool.quake.desc = De grond schudt: vijanden rond de plek raken gewond en zijn twee seconden verdoofd. Je wezens blijven overeind. +tool.freeze.label = Vorst +tool.freeze.name = Vorst +tool.freeze.desc = IJzige kou: lava rond de plek koelt 40 seconden af tot begaanbaar obsidiaan, vijanden worden onderkoeld en vertraagd. tile.unexplored = Onverkend duister # personality diff --git a/lang/no.lang b/lang/no.lang index 9472ffe..b18a062 100644 --- a/lang/no.lang +++ b/lang/no.lang @@ -398,6 +398,9 @@ help.start_touch = Trykk for å starte tool.bridge.label = Bro tool.bridge.name = Bygg bro tool.bridge.desc = Bygger en bro over vann eller lava. Dra fra din egen grunn over elven; broen vokser rute for rute fra området ditt. +tool.drawbridge.label = Vindebro +tool.drawbridge.name = Bygg vindebro +tool.drawbridge.desc = En bro du kan heise opp: dra over elva for å bygge den, klikk for å bytte: nede, oppe, automatisk (heises når fiender nærmer seg). Tre over vann brenner, stein over lava gjør ikke. cost.bridge = {0} gull/rute over vann, {1} over lava hint.bridge_where = Broer må starte på din egen grunn: dra fra området ditt over elven. hint.bridge_fire = Trebroer brenner: hold ildfeller, ildpust og lyn unna dem – steinbroer over lava er brannsikre. @@ -410,6 +413,15 @@ tile.lava = Lava tile.lava_info = Det som faller i, brenner. Steinbroer fører over. tile.bridge = Trebro tile.lavabridge = Steinbro +tile.drawbridge = Vindebro +tile.drawbridge_up = Heist opp +tile.drawbridge_down = Senket +tile.drawbridge_auto = Automatisk (nede) +tile.drawbridge_auto_up = Automatisk (oppe) +tile.obsidian = Obsidian +tile.obsidian_info = Avkjølt lava – smelter om {0} s +tile.bridge_burning = Brenner! +tile.bridge_worn = Skadet {0}% tile.shard = Skår av sjelekjernen din tile.shard_info = Innta dette kammeret for å ta skåret tilbake. @@ -432,6 +444,10 @@ msg.vault_taken = Riddernes hvelv inntatt: skatter verdt {0} er dine. msg.shard_taken = Et skår av sjelekjernen din er tilbake i hendene dine! msg.bridge_torn = Ridderne har revet ned en av broene dine! msg.bridge_fire = En av broene dine brenner! +msg.drawbridge_up = Vindebroen er heist opp. +msg.drawbridge_down = Vindebroen er senket. +msg.drawbridge_auto = Vindebroen heises av seg selv når fiender nærmer seg. +msg.drawbridge_rises = Fiender nærmer seg: en vindebro heises! job.tear_bridge = River ned en bro job.patrol = På patrulje job.guard = På vakt @@ -803,6 +819,7 @@ best.b.torture.text = Fangede helter havner her. Med tid og en fangevokter bytte best.b.temple.text = Bønner leger sjelekjernen og holder humøret oppe. Flammeprestinnen kommer for et tempel. best.b.aerie.text = Sittepinner og reder for flygende skapninger. Flaggermus, gargoyler, ugler og til og med glødlindormen trenger plass her. best.b.bridge.text = Tre over vann, stein over lava. Ridderne river ned broene dine - innta deres. +best.b.drawbridge.text = Heist opp er elva en mur igjen. På automatisk heises den når fiender nærmer seg – og senkes for dine egne skapninger. best.b.steel.text = Naglede jernplater på en forsterket vegg. Ingen graver seg raskt gjennom, ikke engang dverger. best.b.arrow.text = Pilen gjennomborer opptil to fiender til bak målet. Billig og pålitelig. best.b.cannon.text = Områdeskade og tilbakeslag - dytt ridderne i lavaen. @@ -928,6 +945,9 @@ tool.plague.desc = En sykdom som tærer på fiendene rundt stedet og hopper fra tool.quake.label = Skjelv tool.quake.name = Jordskjelv tool.quake.desc = Bakken rister: fiender rundt stedet skades og lammes i to sekunder. Skapningene dine holder balansen. +tool.freeze.label = Frost +tool.freeze.name = Frost +tool.freeze.desc = Isende kulde: lava rundt stedet kjøles til gangbar obsidian i 40 sekunder, fiender blir nedkjølt og trege. tile.unexplored = Uutforsket mørke # personality diff --git a/lang/pt.lang b/lang/pt.lang index 60ff806..020c070 100644 --- a/lang/pt.lang +++ b/lang/pt.lang @@ -399,6 +399,9 @@ help.start_touch = Toca para começar tool.bridge.label = Ponte tool.bridge.name = Construir Ponte tool.bridge.desc = Constrói uma ponte sobre água ou lava. Arrasta a partir do teu chão através do rio; a ponte cresce casa a casa a partir do teu território. +tool.drawbridge.label = Levadiça +tool.drawbridge.name = Construir ponte levadiça +tool.drawbridge.desc = Uma ponte que podes levantar: arrasta sobre o rio para a construir, clica para mudar: em baixo, em cima, automática (sobe quando os inimigos se aproximam). Madeira sobre água arde, pedra sobre lava não. cost.bridge = {0} de ouro/casa sobre água, {1} sobre lava hint.bridge_where = As pontes têm de começar no teu chão: arrasta a partir do teu território através do rio. hint.bridge_fire = As pontes de madeira ardem: mantém armadilhas de fogo, sopro de fogo e relâmpagos longe delas – as pontes de pedra sobre lava não ardem. @@ -411,6 +414,15 @@ tile.lava = Lava tile.lava_info = O que cai lá dentro arde. As pontes de pedra atravessam-na. tile.bridge = Ponte de madeira tile.lavabridge = Ponte de pedra +tile.drawbridge = Ponte levadiça +tile.drawbridge_up = Levantada +tile.drawbridge_down = Baixada +tile.drawbridge_auto = Automática (em baixo) +tile.drawbridge_auto_up = Automática (em cima) +tile.obsidian = Obsidiana +tile.obsidian_info = Lava arrefecida – derrete em {0} s +tile.bridge_burning = A arder! +tile.bridge_worn = Danificada {0}% tile.shard = Fragmento do teu núcleo de alma tile.shard_info = Reclama esta câmara para recuperar o fragmento. @@ -433,6 +445,10 @@ msg.vault_taken = Cofre dos cavaleiros tomado: {0} em tesouros são teus. msg.shard_taken = Um fragmento do teu núcleo de alma está de novo nas tuas mãos! msg.bridge_torn = Os cavaleiros destruíram uma das tuas pontes! msg.bridge_fire = Uma das tuas pontes está a arder! +msg.drawbridge_up = A ponte levadiça está levantada. +msg.drawbridge_down = A ponte levadiça está baixada. +msg.drawbridge_auto = A ponte levadiça sobe sozinha quando os inimigos se aproximam. +msg.drawbridge_rises = Inimigos perto: uma ponte levadiça sobe! job.tear_bridge = A destruir uma ponte job.patrol = De patrulha job.guard = De guarda @@ -804,6 +820,7 @@ best.b.torture.text = Os heróis capturados acabam aqui. Com tempo e um carcerei best.b.temple.text = As orações curam o núcleo de alma e mantêm o moral alto. A sacerdotisa das chamas vem por um templo. best.b.aerie.text = Poleiros e ninhos para criaturas voadoras. Morcegos, gárgulas, corujas e até a serpe de brasa precisam de espaço aqui. best.b.bridge.text = Madeira sobre água, pedra sobre lava. Os cavaleiros destroem as tuas pontes - reclama as deles. +best.b.drawbridge.text = Levantada, o rio volta a ser uma muralha. Em automático sobe quando os inimigos se aproximam e desce para as tuas criaturas. best.b.steel.text = Placas de ferro rebitadas numa parede reforçada. Ninguém a escava depressa, nem sequer os anões. best.b.arrow.text = A flecha trespassa até mais dois inimigos atrás do alvo. Barata e fiável. best.b.cannon.text = Dano em área e repulsão - empurra os cavaleiros para a lava. @@ -929,6 +946,9 @@ tool.plague.desc = Uma doença que corrói os inimigos à volta do ponto e salta tool.quake.label = Sismo tool.quake.name = Sismo tool.quake.desc = O chão treme: os inimigos à volta do ponto são feridos e atordoados durante dois segundos. As tuas criaturas mantêm-se de pé. +tool.freeze.label = Gelo +tool.freeze.name = Gelo +tool.freeze.desc = Frio gélido: a lava à volta arrefece em obsidiana transitável durante 40 segundos, os inimigos ficam gelados e lentos. tile.unexplored = Escuridão inexplorada # personality diff --git a/lang/ro.lang b/lang/ro.lang index 5e9346f..f85398f 100644 --- a/lang/ro.lang +++ b/lang/ro.lang @@ -399,6 +399,9 @@ help.start_touch = Atinge pentru a începe tool.bridge.label = Pod tool.bridge.name = Construiește Pod tool.bridge.desc = Construiește un pod peste apă sau lavă. Trage de pe terenul tău peste râu; podul crește dală cu dală dinspre teritoriul tău. +tool.drawbridge.label = Pod mobil +tool.drawbridge.name = Construiește pod mobil +tool.drawbridge.desc = Un pod pe care îl poți ridica: trage peste râu ca să-l construiești, dă clic pentru a schimba: jos, sus, automat (se ridică atunci când se apropie dușmanii). Lemnul peste apă arde, piatra peste lavă nu. cost.bridge = {0} aur/dală peste apă, {1} peste lavă hint.bridge_where = Podurile trebuie să pornească de pe terenul tău: trage de pe teritoriul tău peste râu. hint.bridge_fire = Podurile de lemn ard: ține capcanele de foc, suflarea de foc și fulgerele departe de ele – podurile de piatră peste lavă nu ard. @@ -411,6 +414,15 @@ tile.lava = Lavă tile.lava_info = Ce cade înăuntru arde. Podurile de piatră o traversează. tile.bridge = Pod de lemn tile.lavabridge = Pod de piatră +tile.drawbridge = Pod mobil +tile.drawbridge_up = Ridicat +tile.drawbridge_down = Coborât +tile.drawbridge_auto = Automat (jos) +tile.drawbridge_auto_up = Automat (sus) +tile.obsidian = Obsidian +tile.obsidian_info = Lavă răcită – se topește în {0} s +tile.bridge_burning = Arde! +tile.bridge_worn = Deteriorat {0}% tile.shard = Ciob din miezul sufletului tău tile.shard_info = Cucerește această cameră ca să iei ciobul înapoi. @@ -433,6 +445,10 @@ msg.vault_taken = Seif al cavalerilor cucerit: o comoară în valoare de {0} e a msg.shard_taken = Un ciob din miezul sufletului tău e din nou în mâinile tale! msg.bridge_torn = Cavalerii ți-au dărâmat unul dintre poduri! msg.bridge_fire = Unul dintre podurile tale arde! +msg.drawbridge_up = Podul mobil este ridicat. +msg.drawbridge_down = Podul mobil este coborât. +msg.drawbridge_auto = Podul mobil se ridică singur când se apropie dușmanii. +msg.drawbridge_rises = Se apropie dușmani: un pod mobil se ridică! job.tear_bridge = Dărâmă un pod job.patrol = În patrulă job.guard = De pază @@ -804,6 +820,7 @@ best.b.torture.text = Eroii capturați ajung aici. Cu timp și un temnicer, unii best.b.temple.text = Rugăciunile vindecă miezul sufletului și țin moralul sus. Preoteasa flăcării vine pentru un templu. best.b.aerie.text = Stinghii și cuiburi pentru creaturile zburătoare. Liliecii, gargujii, bufnițele și chiar balaurul de jar au nevoie de loc aici. best.b.bridge.text = Lemn peste apă, piatră peste lavă. Cavalerii îți dărâmă podurile - cucerește-le pe ale lor. +best.b.drawbridge.text = Ridicat, râul devine din nou zid. Pe automat se ridică atunci când se apropie dușmanii – și coboară pentru creaturile tale. best.b.steel.text = Plăci de fier nituite pe un zid întărit. Nimeni nu sapă repede prin el, nici măcar piticii. best.b.arrow.text = Săgeata străpunge până la doi dușmani din spatele țintei. Ieftin și de încredere. best.b.cannon.text = Daune în zonă și recul - împinge cavalerii în lavă. @@ -929,6 +946,9 @@ tool.plague.desc = O boală care roade dușmanii din jurul locului și sare de l tool.quake.label = Cutremur tool.quake.name = Cutremur tool.quake.desc = Pământul se cutremură: dușmanii din jurul locului sunt răniți și amețiți două secunde. Creaturile tale rămân în picioare. +tool.freeze.label = Ger +tool.freeze.name = Ger +tool.freeze.desc = Frig cumplit: lava din jur se răcește în obsidian pe care se poate merge timp de 40 de secunde, dușmanii sunt înghețați și încetiniți. tile.unexplored = Întuneric neexplorat # personality diff --git a/lang/ru.lang b/lang/ru.lang index bfbe908..f5f59f1 100644 --- a/lang/ru.lang +++ b/lang/ru.lang @@ -399,6 +399,9 @@ help.start_touch = Коснись, чтобы начать tool.bridge.label = Мост tool.bridge.name = Построить мост tool.bridge.desc = Строит мост через воду или лаву. Тяни от своей земли через реку; мост растёт клетка за клеткой от твоей территории. +tool.drawbridge.label = Подъёмный +tool.drawbridge.name = Построить подъёмный мост +tool.drawbridge.desc = Мост, который можно поднять: протяните через реку, чтобы построить, щёлкните, чтобы переключить: опущен, поднят, автоматически (поднимается при приближении врагов). Дерево над водой горит, камень над лавой — нет. cost.bridge = {0} золота/клетка над водой, {1} над лавой hint.bridge_where = Мост должен начинаться у твоей земли: тяни от своей территории через реку. hint.bridge_fire = Деревянные мосты горят: держите огненные ловушки, огненное дыхание и молнии подальше; каменные мосты над лавой не горят. @@ -411,6 +414,15 @@ tile.lava = Лава tile.lava_info = Всё, что туда падает, сгорает. Её пересекают каменные мосты. tile.bridge = Деревянный мост tile.lavabridge = Каменный мост +tile.drawbridge = Подъёмный мост +tile.drawbridge_up = Поднят +tile.drawbridge_down = Опущен +tile.drawbridge_auto = Автоматически (опущен) +tile.drawbridge_auto_up = Автоматически (поднят) +tile.obsidian = Обсидиан +tile.obsidian_info = Застывшая лава — растает через {0} с +tile.bridge_burning = Горит! +tile.bridge_worn = Повреждён на {0}% tile.shard = Осколок твоего ядра души tile.shard_info = Захвати этот зал, чтобы вернуть осколок. @@ -433,6 +445,10 @@ msg.vault_taken = Рыцарское хранилище взято: сокров msg.shard_taken = Осколок твоего ядра души снова в твоих руках! msg.bridge_torn = Рыцари разрушили один из твоих мостов! msg.bridge_fire = Один из ваших мостов горит! +msg.drawbridge_up = Подъёмный мост поднят. +msg.drawbridge_down = Подъёмный мост опущен. +msg.drawbridge_auto = Подъёмный мост сам поднимается при приближении врагов. +msg.drawbridge_rises = Враги близко: подъёмный мост поднимается! job.tear_bridge = Ломает мост job.patrol = В дозоре job.guard = На страже @@ -796,6 +812,7 @@ best.b.torture.text = Сюда попадают пленные герои. Со best.b.temple.text = Молитвы лечат ядро души и поднимают дух. Жрица пламени приходит на храм. best.b.aerie.text = Насесты и гнёзда для летунов. Нетопырям, горгульям, совам и даже огненному змию нужно здесь место. best.b.bridge.text = Дерево над водой, камень над лавой. Рыцари ломают твои мосты - захватывай их мосты. +best.b.drawbridge.text = Поднимите его — и река снова стена. В автоматическом режиме он поднимается при приближении врагов и опускается для ваших существ. best.b.steel.text = Клёпаные железные листы на укреплённой стене. Быстро никто не прокопает, даже гномы. best.b.arrow.text = Стрела пробивает ещё до двух врагов за целью. Дёшево и надёжно. best.b.cannon.text = Урон по площади и отбрасывание - столкни рыцарей в лаву. @@ -921,6 +938,9 @@ tool.plague.desc = Хворь, которая гложет врагов вокр tool.quake.label = Толчок tool.quake.name = Землетрясение tool.quake.desc = Земля дрожит: враги вокруг точки ранены и оглушены на две секунды. Твои существа стоят на ногах. +tool.freeze.label = Мороз +tool.freeze.name = Мороз +tool.freeze.desc = Ледяной холод: лава вокруг на 40 секунд застывает в проходимый обсидиан, враги замерзают и замедляются. tile.unexplored = Неизведанная тьма # personality diff --git a/lang/sk.lang b/lang/sk.lang index b082ad0..240ae74 100644 --- a/lang/sk.lang +++ b/lang/sk.lang @@ -399,6 +399,9 @@ help.start_touch = Ťukni pre štart tool.bridge.label = Most tool.bridge.name = Postaviť most tool.bridge.desc = Postaví most cez vodu alebo lávu. Ťahaj z vlastnej zeme cez rieku; most rastie políčko po políčku od tvojho územia. +tool.drawbridge.label = Padací most +tool.drawbridge.name = Postaviť padací most +tool.drawbridge.desc = Most, ktorý môžeš vytiahnuť: potiahni cez rieku a postav ho, kliknutím prepínaš: dole, hore, automaticky (zdvihne sa, keď sa blížia nepriatelia). Drevo nad vodou horí, kameň nad lávou nie. cost.bridge = {0} zlata/políčko cez vodu, {1} cez lávu hint.bridge_where = Mosty musia začínať na tvojej zemi: ťahaj zo svojho územia cez rieku. hint.bridge_fire = Drevené mosty horia: drž ohnivé pasce, ohnivý dych a blesky ďalej od nich – kamenné mosty nad lávou nehoria. @@ -411,6 +414,15 @@ tile.lava = Láva tile.lava_info = Čo do nej spadne, zhorí. Prechádzajú ju kamenné mosty. tile.bridge = Drevený most tile.lavabridge = Kamenný most +tile.drawbridge = Padací most +tile.drawbridge_up = Vytiahnutý +tile.drawbridge_down = Spustený +tile.drawbridge_auto = Automaticky (dole) +tile.drawbridge_auto_up = Automaticky (hore) +tile.obsidian = Obsidián +tile.obsidian_info = Stuhnutá láva – roztopí sa o {0} s +tile.bridge_burning = Horí! +tile.bridge_worn = Poškodený {0}% tile.shard = Črep tvojho jadra duše tile.shard_info = Zaber túto komnatu a získaš črep späť. @@ -433,6 +445,10 @@ msg.vault_taken = Rytiersky trezor dobytý: poklad v hodnote {0} je tvoj. msg.shard_taken = Črep tvojho jadra duše je späť v tvojich rukách! msg.bridge_torn = Rytieri strhli jeden z tvojich mostov! msg.bridge_fire = Jeden z tvojich mostov horí! +msg.drawbridge_up = Padací most je vytiahnutý. +msg.drawbridge_down = Padací most je spustený. +msg.drawbridge_auto = Padací most sa sám zdvihne, keď sa blížia nepriatelia. +msg.drawbridge_rises = Blížia sa nepriatelia: padací most sa zdvíha! job.tear_bridge = Strháva most job.patrol = Na hliadke job.guard = Na stráži @@ -804,6 +820,7 @@ best.b.torture.text = Sem končia zajatí hrdinovia. S časom a žalárnikom nie best.b.temple.text = Modlitby liečia jadro duše a držia dobrú náladu. Kvôli chrámu prichádza plamenná kňažka. best.b.aerie.text = Bidlá a hniezda pre lietajúce tvory. Netopiere, chrliče, sovy aj žeravý šarkan tu potrebujú miesto. best.b.bridge.text = Drevo cez vodu, kameň cez lávu. Rytieri tvoje mosty strhávajú - zaber tie ich. +best.b.drawbridge.text = Vytiahnutý most robí z rieky opäť múr. V automatickom režime sa zdvihne, keď sa blížia nepriatelia – a spustí sa pre tvoje bytosti. best.b.steel.text = Nitované železné pláty na spevnenej stene. Nikto sa rýchlo neprekope, ani trpaslíci. best.b.arrow.text = Šíp preletí až dvoma ďalšími nepriateľmi za cieľom. Lacná a spoľahlivá. best.b.cannon.text = Plošné poškodenie a odhodenie - natlač rytierov do lávy. @@ -929,6 +946,9 @@ tool.plague.desc = Choroba, ktorá zožiera nepriateľov okolo miesta a preskaku tool.quake.label = Otras tool.quake.name = Zemetrasenie tool.quake.desc = Zem sa otrasie: nepriatelia okolo miesta sú zranení a na dve sekundy omráčení. Tvoje tvory sa udržia na nohách. +tool.freeze.label = Mráz +tool.freeze.name = Mráz +tool.freeze.desc = Ľadová zima: láva okolo miesta na 40 sekúnd stuhne na priechodný obsidián, nepriatelia sú podchladení a spomalení. tile.unexplored = Nepreskúmaná temnota # personality diff --git a/lang/sr.lang b/lang/sr.lang index f41ea87..aea2cd8 100644 --- a/lang/sr.lang +++ b/lang/sr.lang @@ -399,6 +399,9 @@ help.start_touch = Додирни за почетак tool.bridge.label = Мост tool.bridge.name = Градња моста tool.bridge.desc = Гради мост преко воде или лаве. Превуци са свог тла преко реке; мост расте поље по поље од твоје територије. +tool.drawbridge.label = Покретни мост +tool.drawbridge.name = Изгради покретни мост +tool.drawbridge.desc = Мост који можеш подићи: повуци преко реке да га изградиш, кликни за промену: доле, горе, аутоматски (диже се кад се непријатељи приближе). Дрво над водом гори, камен над лавом не. cost.bridge = {0} злата/поље преко воде, {1} преко лаве hint.bridge_where = Мостови морају да почну на твом тлу: превуци са своје територије преко реке. hint.bridge_fire = Дрвени мостови горе: држи ватрене замке, ватрени дах и муње подаље – камени мостови над лавом не горе. @@ -411,6 +414,15 @@ tile.lava = Лава tile.lava_info = Шта год упадне, изгори. Камени мостови је премошћују. tile.bridge = Дрвени мост tile.lavabridge = Камени мост +tile.drawbridge = Покретни мост +tile.drawbridge_up = Подигнут +tile.drawbridge_down = Спуштен +tile.drawbridge_auto = Аутоматски (доле) +tile.drawbridge_auto_up = Аутоматски (горе) +tile.obsidian = Опсидијан +tile.obsidian_info = Охлађена лава – топи се за {0} s +tile.bridge_burning = Гори! +tile.bridge_worn = Оштећен {0}% tile.shard = Крхотина твог језгра душе tile.shard_info = Освоји ову одају да вратиш крхотину. @@ -433,6 +445,10 @@ msg.vault_taken = Витешки трезор освојен: благо вре msg.shard_taken = Крхотина твог језгра душе поново је у твојим рукама! msg.bridge_torn = Витезови су срушили један од твојих мостова! msg.bridge_fire = Један од твојих мостова гори! +msg.drawbridge_up = Покретни мост је подигнут. +msg.drawbridge_down = Покретни мост је спуштен. +msg.drawbridge_auto = Покретни мост се сам диже кад се непријатељи приближе. +msg.drawbridge_rises = Непријатељи близу: покретни мост се диже! job.tear_bridge = Руши мост job.patrol = У патроли job.guard = На стражи @@ -804,6 +820,7 @@ best.b.torture.text = Заробљени хероји заврше овде. С best.b.temple.text = Молитве лече језгро душе и држе дух високо. Свештеница пламена долази због храма. best.b.aerie.text = Пречке и гнезда за летећа створења. Шишмишима, гаргојлима, совама, па и жарком змају овде треба места. best.b.bridge.text = Дрво преко воде, камен преко лаве. Витезови руше твоје мостове - освоји њихове. +best.b.drawbridge.text = Подигнут, река је опет зид. На аутоматском се диже кад се непријатељи приближе – и спушта за твоја створења. best.b.steel.text = Заковане гвоздене плоче на ојачаном зиду. Нико се не прокопа брзо, чак ни патуљци. best.b.arrow.text = Стрела пробија до два непријатеља иза мете. Јефтино и поуздано. best.b.cannon.text = Штета у подручју и одбацивање - гурни витезове у лаву. @@ -929,6 +946,9 @@ tool.plague.desc = Болест која изједа непријатеље о tool.quake.label = Потрес tool.quake.name = Земљотрес tool.quake.desc = Тло се тресе: непријатељи око места су повређени и ошамућени две секунде. Твоја створења остају на ногама. +tool.freeze.label = Мраз +tool.freeze.name = Мраз +tool.freeze.desc = Ледена хладноћа: лава око места се на 40 секунди хлади у проходни опсидијан, непријатељи се смрзавају и успоравају. tile.unexplored = Неистражена тама # personality diff --git a/lang/sv.lang b/lang/sv.lang index e6b4b16..9ee5a5c 100644 --- a/lang/sv.lang +++ b/lang/sv.lang @@ -399,6 +399,9 @@ help.start_touch = Tryck för att börja tool.bridge.label = Bro tool.bridge.name = Bygg bro tool.bridge.desc = Bygger en bro över vatten eller lava. Dra från din egen mark över floden; bron växer ruta för ruta från ditt territorium. +tool.drawbridge.label = Vindbrygga +tool.drawbridge.name = Bygg vindbrygga +tool.drawbridge.desc = En bro du kan hissa upp: dra över floden för att bygga den, klicka för att växla: nere, uppe, automatisk (hissas när fiender närmar sig). Trä över vatten brinner, sten över lava gör det inte. cost.bridge = {0} guld/ruta över vatten, {1} över lava hint.bridge_where = Broar måste börja vid din egen mark: dra från ditt territorium över floden. hint.bridge_fire = Träbroar brinner: håll eldfällor, eldande och blixtar borta från dem – stenbroar över lava är brandsäkra. @@ -411,6 +414,15 @@ tile.lava = Lava tile.lava_info = Det som faller i brinner upp. Stenbroar korsar den. tile.bridge = Träbro tile.lavabridge = Stenbro +tile.drawbridge = Vindbrygga +tile.drawbridge_up = Uppdragen +tile.drawbridge_down = Nedsänkt +tile.drawbridge_auto = Automatisk (nere) +tile.drawbridge_auto_up = Automatisk (uppe) +tile.obsidian = Obsidian +tile.obsidian_info = Avsvalnad lava – smälter om {0} s +tile.bridge_burning = Brinner! +tile.bridge_worn = Skadad {0}% tile.shard = Skärva av din själskärna tile.shard_info = Erövra den här kammaren för att ta tillbaka skärvan. @@ -433,6 +445,10 @@ msg.vault_taken = Riddarvalv erövrat: skatter värda {0} är dina. msg.shard_taken = En skärva av din själskärna är tillbaka i dina händer! msg.bridge_torn = Riddarna har rivit en av dina broar! msg.bridge_fire = En av dina broar brinner! +msg.drawbridge_up = Vindbryggan är uppdragen. +msg.drawbridge_down = Vindbryggan är nedsänkt. +msg.drawbridge_auto = Vindbryggan hissas av sig själv när fiender närmar sig. +msg.drawbridge_rises = Fiender närmar sig: en vindbrygga hissas! job.tear_bridge = River en bro job.patrol = På patrull job.guard = På vakt @@ -804,6 +820,7 @@ best.b.torture.text = Tillfångatagna hjältar hamnar här. Med tid och en fång best.b.temple.text = Böner läker själskärnan och håller humöret uppe. Flamprästinnan kommer för ett tempel. best.b.aerie.text = Sittpinnar och bon för flygande varelser. Fladdermöss, gargoyler, ugglor och till och med glödlindormen behöver plats här. best.b.bridge.text = Trä över vatten, sten över lava. Riddarna river dina broar - erövra deras. +best.b.drawbridge.text = Uppdragen är floden en mur igen. På automatik hissas den när fiender närmar sig – och sänks för dina egna varelser. best.b.steel.text = Nitade järnplåtar på en förstärkt vägg. Ingen gräver sig snabbt igenom, inte ens dvärgar. best.b.arrow.text = Pilen genomborrar upp till två fiender till bakom målet. Billigt och pålitligt. best.b.cannon.text = Områdesskada och tillbakaslag - knuffa ner riddarna i lavan. @@ -929,6 +946,9 @@ tool.plague.desc = En sjukdom som fräter på fienderna runt platsen och hoppar tool.quake.label = Skalv tool.quake.name = Jordskalv tool.quake.desc = Marken skakar: fiender runt platsen skadas och bedövas i två sekunder. Dina varelser står kvar på fötterna. +tool.freeze.label = Frost +tool.freeze.name = Frost +tool.freeze.desc = Isande kyla: lava runt platsen kyls till gångbar obsidian i 40 sekunder, fiender blir nedkylda och långsamma. tile.unexplored = Outforskat mörker # personality diff --git a/src/bridges.rs b/src/bridges.rs index 6ff6710..a519a25 100644 --- a/src/bridges.rs +++ b/src/bridges.rs @@ -1,6 +1,8 @@ // Bridges under strain: wooden bridges catch fire (fire traps, fire breath, fireballs, lightning), // the fire spreads along the planks and the bridge collapses into the river; knights wear bridges // down step by step, pit imps mend them again. Stone bridges over lava never burn. +// Drawbridges are raised and lowered by hand or rise by themselves when enemies come near. +// Frost (the frost glow trap, the frost spell) cools lava into walkable obsidian for a while. use crate::game::*; use crate::map::*; @@ -17,17 +19,26 @@ pub const BURN_DPS: f32 = 6.0; pub const TEAR_RATE: f32 = 0.12; // wear an imp mends per second pub const MEND_RATE: f32 = 0.25; +// an automatic drawbridge rises when an enemy comes this close (tiles) +pub const DRAWBRIDGE_WATCH: f32 = 6.0; +// seconds the frost spell keeps lava cooled; the last seconds it steams +pub const FREEZE_TIME: f32 = 40.0; +pub const MELT_WARN: f32 = 5.0; #[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct BridgeWork { pub burning: Vec<(usize, f32)>, // tile, seconds it burns already pub wear: Vec<(usize, f32)>, // tile, damage 0..1 + #[serde(default)] + pub cooled: Vec<(usize, f32)>, // obsidian tile, seconds until it melts + #[serde(default)] + pub watch_t: f32, // automatic drawbridges look around twice a second } impl Game { // a wooden bridge (or wooden drawbridge) that can burn pub fn wooden_bridge(&self, i: usize) -> bool { - self.map.t.get(i).map_or(false, |t| t.kind == Kind::Bridge) + self.map.t.get(i).map_or(false, |t| t.kind == Kind::Bridge || (t.kind == Kind::Drawbridge && t.res & DB_LAVA == 0)) } pub fn burning(&self, i: usize) -> bool { @@ -65,8 +76,10 @@ impl Game { } } - // the shared part of every step: fire, collapse + // the shared part of every step: fire, collapse, drawbridges, melting obsidian pub(crate) fn update_bridges(&mut self, dt: f32) { + self.update_drawbridges(dt); + self.update_obsidian(dt); if self.bridgework.burning.is_empty() { return; } @@ -135,6 +148,7 @@ impl Game { tl.reserved = 0; tl.res = 0; self.bridgework.wear.retain(|w| w.0 != i); + self.bridgework.burning.retain(|w| w.0 != i); self.ground_lost(i); let (x, y) = xy(i); self.fx(6, x as f32 + 0.5, y as f32 + 0.5, 0.0, 0.0, 0.6, 0xff3a5a7a); @@ -187,6 +201,181 @@ impl Game { } } +// ------------------------------------------------------------------ drawbridges and frost +impl Game { + // the drawbridge tiles connected to tile i (same owner) + pub fn drawbridge_group(&self, i: usize) -> Vec { + let owner = self.map.t[i].owner; + let mut group = vec![i]; + let mut k = 0; + while k < group.len() { + let (x, y) = xy(group[k]); + for &(dx, dy) in DIR4.iter() { + if !inb(x + dx, y + dy) { + continue; + } + let n = idx(x + dx, y + dy); + let t = &self.map.t[n]; + if t.kind == Kind::Drawbridge && t.owner == owner && !group.contains(&n) { + group.push(n); + } + } + k += 1; + } + group + } + + // the drawbridge tool: a click on an own drawbridge switches it (down -> up -> automatic -> down), + // anything else builds drawbridges like bridges + pub fn drawbridge_order(&mut self, x0: i32, y0: i32, x1: i32, y1: i32) { + if x0 == x1 && y0 == y1 && inb(x0, y0) { + let i = idx(x0, y0); + let t = self.map.t[i]; + if t.kind == Kind::Drawbridge && t.owner == self.me { + let state = t.res & (DB_RAISED | DB_AUTO); + let next = match state { + 0 => DB_RAISED, + s if s & DB_AUTO != 0 => 0, + _ => DB_AUTO, + }; + self.set_drawbridge(i, next); + let key = match next { + DB_RAISED => "msg.drawbridge_up", + DB_AUTO => "msg.drawbridge_auto", + _ => "msg.drawbridge_down", + }; + self.msg(key, vec![]); + self.sfx_ui(Sfx::Click); + return; + } + } + self.build_bridges_of(x0, y0, x1, y1, true); + } + + // sets the state bits (DB_RAISED, DB_AUTO) of the whole drawbridge at tile i + pub fn set_drawbridge(&mut self, i: usize, state: u8) { + let group = self.drawbridge_group(i); + let raise = state & DB_RAISED != 0 && !self.map.t[i].raised(); + let lower = state & DB_RAISED == 0 && self.map.t[i].raised(); + for &g in &group { + let t = &mut self.map.t[g]; + t.res = (t.res & DB_LAVA) | state; + } + if raise { + // whoever stands on it jumps to the bank (or falls) + for &g in &group { + self.ground_lost(g); + } + } + if raise || lower { + let (x, y) = xy(i); + self.sfx(Sfx::Build, x as f32 + 0.5, y as f32 + 0.5); + for &g in &group { + let (gx, gy) = xy(g); + self.fx(6, gx as f32 + 0.5, gy as f32 + 0.5, 0.0, 0.0, 0.3, 0xff506070); + } + } + } + + // automatic drawbridges rise while an enemy of their master is near, and come down again + fn update_drawbridges(&mut self, dt: f32) { + self.bridgework.watch_t -= dt; + if self.bridgework.watch_t > 0.0 { + return; + } + self.bridgework.watch_t = 0.5; + let mut seen: Vec = Vec::new(); + for i in 0..self.map.t.len() { + let t = self.map.t[i]; + if t.kind != Kind::Drawbridge || t.res & DB_AUTO == 0 || seen.contains(&i) { + continue; + } + let group = self.drawbridge_group(i); + seen.extend(group.iter().copied()); + let side = t.owner.side(); + let r2 = DRAWBRIDGE_WATCH * DRAWBRIDGE_WATCH; + let enemy = self.ents.iter().any(|e| { + e.alive + && !e.held + && e.captive == 0 + && !e.chained + && e.side() != side + && !self.allied(side, e.side()) + && group.iter().any(|&g| { + let (gx, gy) = xy(g); + (e.x - gx as f32 - 0.5).powi(2) + (e.y - gy as f32 - 0.5).powi(2) < r2 + }) + }); + if enemy != t.raised() { + self.set_drawbridge(i, DB_AUTO | if enemy { DB_RAISED } else { 0 }); + if enemy && t.owner == self.me { + self.msg("msg.drawbridge_rises", vec![]); + } + } + } + } + + // frost on tile i: lava turns to obsidian (or stays it) for at least `secs` + pub fn cool_lava(&mut self, i: usize, secs: f32) { + let t = &mut self.map.t[i]; + match t.kind { + Kind::Lava => { + t.kind = Kind::Obsidian; + t.owner = Owner::None; + self.bridgework.cooled.push((i, secs)); + let (x, y) = xy(i); + for _ in 0..3 { + self.parts.push(Part { kind: SMOKE, x: x as f32 + self.vrng.f(), y: y as f32 + self.vrng.f(), h: 0.1, vx: 0.0, vy: 0.0, vh: 0.5, t: 0.0, max: 1.6, col: abgr(200, 210, 220), size: 0.16 }); + } + } + Kind::Obsidian => { + if let Some(c) = self.bridgework.cooled.iter_mut().find(|c| c.0 == i) { + c.1 = c.1.max(secs); + } + } + _ => {} + } + } + + // frost in a circle around (x, y) + pub fn cool_lava_around(&mut self, x: f32, y: f32, r: f32, secs: f32) { + let ri = r.ceil() as i32; + let (cx, cy) = (x.floor() as i32, y.floor() as i32); + for ty in cy - ri..=cy + ri { + for tx in cx - ri..=cx + ri { + if inb(tx, ty) && (tx as f32 + 0.5 - x).powi(2) + (ty as f32 + 0.5 - y).powi(2) <= r * r { + self.cool_lava(idx(tx, ty), secs); + } + } + } + } + + // obsidian melts again: it steams before, and whoever still stands there is burnt + fn update_obsidian(&mut self, dt: f32) { + let mut k = 0; + while k < self.bridgework.cooled.len() { + let (i, left) = self.bridgework.cooled[k]; + if self.map.t[i].kind != Kind::Obsidian { + self.bridgework.cooled.swap_remove(k); + continue; + } + let left = left - dt; + self.bridgework.cooled[k].1 = left; + let (x, y) = xy(i); + if left < MELT_WARN && self.vrng.f() < dt * 4.0 { + self.parts.push(Part { kind: SMOKE, x: x as f32 + self.vrng.f(), y: y as f32 + self.vrng.f(), h: 0.05, vx: 0.0, vy: 0.0, vh: 0.4, t: 0.0, max: 1.4, col: abgr(150, 150, 160), size: 0.14 }); + } + if left <= 0.0 { + self.bridgework.cooled.swap_remove(k); + self.map.t[i].kind = Kind::Lava; + self.ground_lost(i); + continue; + } + k += 1; + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -245,4 +434,47 @@ mod tests { while g.wear_bridge(tiles[1], 1.0) {} assert_eq!(g.map.t[tiles[1]].kind, Kind::Water); } + + #[test] + fn drawbridges_switch_and_rise_by_themselves() { + let (mut g, tiles) = bridge_game(); + for &i in &tiles { + g.map.t[i].kind = Kind::Drawbridge; + g.map.t[i].res = 0; + } + let (x, y) = xy(tiles[2]); + g.drawbridge_order(x, y, x, y); + assert!(tiles.iter().all(|&i| g.map.t[i].raised()), "the whole bridge goes up"); + assert!(!g.map.walk(x, y)); + g.drawbridge_order(x, y, x, y); + assert!(tiles.iter().all(|&i| g.map.t[i].res & DB_AUTO != 0 && !g.map.t[i].raised()), "automatic"); + // a knight comes near: it rises + let id = g.spawn(EK::Knight, true, x as f32 + 0.5, y as f32 + 3.5, 1); + for _ in 0..20 { + g.update(0.05); + } + assert!(g.map.t[tiles[2]].raised(), "risen for the knight"); + g.ents.retain(|e| e.id != id); + for _ in 0..20 { + g.update(0.05); + } + assert!(!g.map.t[tiles[2]].raised(), "down again"); + g.drawbridge_order(x, y, x, y); + assert_eq!(g.map.t[tiles[2]].res & (DB_RAISED | DB_AUTO), 0, "back to manual, down"); + } + + #[test] + fn frost_cools_lava_for_a_while() { + let mut g = Game::new(5, 64, 64); + let (cx, cy) = g.map.core; + let i = idx(cx + 6, cy + 6); + g.map.t[i].kind = Kind::Lava; + g.cool_lava(i, 2.0); + assert_eq!(g.map.t[i].kind, Kind::Obsidian); + assert!(g.map.t[i].walkable()); + for _ in 0..(3 * 20) { + g.update(0.05); + } + assert_eq!(g.map.t[i].kind, Kind::Lava, "melted again"); + } } diff --git a/src/commands.rs b/src/commands.rs index 01c17b1..2beaa2a 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -34,6 +34,7 @@ pub enum Act { Sell(Rect), Bridge(Rect), Steel(Rect), + Drawbridge(Rect), // build drawbridges, or (one tile on an own drawbridge) switch it: down, up, automatic Tower { kind: TowerKind, x: i32, @@ -141,7 +142,7 @@ impl Game { Act::Dig(r) => (rect_center(r), MARK_DIG, 4.0), Act::Room { r, .. } => (rect_center(r), MARK_ROOM, 5.0), Act::Sell(r) => (rect_center(r), MARK_SELL, 4.0), - Act::Bridge(r) => (rect_center(r), MARK_BRIDGE, 4.0), + Act::Bridge(r) | Act::Drawbridge(r) => (rect_center(r), MARK_BRIDGE, 4.0), Act::Steel(r) => (rect_center(r), MARK_STEEL, 4.0), Act::Tower { x, y, .. } => (point(x as f32, y as f32), MARK_TOWER, 6.0), Act::Trap { x, y, .. } => (point(x as f32, y as f32), MARK_TRAP, 6.0), @@ -185,6 +186,7 @@ impl Game { Act::Room { room, r } => self.build_rect(room as usize, r.x0, r.y0, r.x1, r.y1), Act::Sell(r) => self.sell_rect(r.x0, r.y0, r.x1, r.y1), Act::Bridge(r) => self.build_bridges(r.x0, r.y0, r.x1, r.y1), + Act::Drawbridge(r) => self.drawbridge_order(r.x0, r.y0, r.x1, r.y1), Act::Steel(r) => self.build_steel(r.x0, r.y0, r.x1, r.y1), Act::Tower { kind, x, y } => self.build_tower(kind, x, y), Act::Trap { kind, x, y } => self.place_trap(kind, x, y), diff --git a/src/game.rs b/src/game.rs index dee77a4..0457945 100644 --- a/src/game.rs +++ b/src/game.rs @@ -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; } diff --git a/src/gfx.rs b/src/gfx.rs index 577b2bc..0388258 100644 --- a/src/gfx.rs +++ b/src/gfx.rs @@ -80,6 +80,9 @@ pub const T_ARENA: u32 = 178; pub const T_ALTAR: u32 = 182; pub const I_ORDERS: u32 = 186; // attack, guard pub const T_RIVAL3: u32 = 189; // 4 variants: floor of the yellow master +pub const I_DRAWBRIDGE: u32 = 193; // drawbridge tool: a raised flap on chains +pub const I_FREEZE: u32 = 194; // frost spell: a snowflake +pub const T_OBSIDIAN: u32 = 195; // 4 variants: cooled lava, dark glass with glowing seams pub struct Gfx { pub atlas: Texture2D, @@ -803,6 +806,50 @@ fn gen_atlas() -> Image { None } }); + // drawbridge tool icon: a raised flap with its chains above a river + cv.cell(I_DRAWBRIDGE, |x, y| { + if (3..=5).contains(&x) && (2..=12).contains(&y) { + Some(if y % 3 == 0 { c(70, 46, 26) } else { c(150, 106, 60) }) + } else if y == 12 && (5..=13).contains(&x) { + Some(c(110, 76, 44)) + } else if (x - 5) * 2 == (y - 2) * 1 + 2 && (6..=12).contains(&x) { + Some(c(170, 170, 180)) // chain + } else if x == 13 && (3..=12).contains(&y) { + Some(c(90, 90, 100)) // post + } else if y >= 13 && (1..=14).contains(&x) { + Some(c(60, 110, 170)) + } else { + None + } + }); + // frost spell icon: a snowflake + cv.cell(I_FREEZE, |x, y| { + let (dx, dy) = (x - 8, y - 8); + let arm = dx == 0 || dy == 0 || dx == dy || dx == -dy; + let r = dx.abs().max(dy.abs()); + if arm && r <= 6 { + Some(if r <= 1 { c(240, 250, 255) } else { c(150, 210, 255) }) + } else if r == 4 && (dx.abs() == 1 || dy.abs() == 1) && (dx == 0 || dy == 0 || dx.abs() == dy.abs() + 1 || dy.abs() == dx.abs() + 1) { + Some(c(200, 235, 255)) + } else { + None + } + }); + // obsidian: cooled lava, dark glass with a few glowing seams + for v in 0..4u32 { + cv.cell(T_OBSIDIAN + v, |x, y| { + let r = hash(x, y, v + 400); + if (x * 5 + y * 3 + v as i32 * 7) % 29 == 0 || ((x + 2 * y + v as i32) % 23 == 0 && r % 2 == 0) { + Some(c(230, 90, 30)) + } else if r % 11 == 0 { + Some(c(70, 60, 90)) + } else if (x + y) % 7 == 0 { + Some(c(34, 26, 40)) + } else { + Some(c(22, 16, 26)) + } + }); + } // ---- more treasures: veins (earth with embedded pieces) and treasury piles let vein = |x: i32, y: i32, v: u32, seed: u32, hi: Color, mid: Color, lo: Color, size: f32| -> Color { let mut best = 99.0f32; @@ -1927,7 +1974,8 @@ impl Gfx { Kind::Tower => T_CLAIM + v, Kind::Water => T_WATER + v, Kind::Lava => T_LAVA + v, - Kind::Bridge => T_BRIDGE + (v & 1), + Kind::Bridge | Kind::Drawbridge => T_BRIDGE + (v & 1), + Kind::Obsidian => T_OBSIDIAN + v, Kind::LavaBridge => T_STONEBRIDGE + (v & 1), Kind::Shard => T_HEROFLOOR + v, Kind::Aerie => T_AERIE + v, @@ -2137,8 +2185,8 @@ mod doc_images { for (k, t) in crate::traps::TRAP_KINDS.iter().enumerate() { save(&atlas, Gfx::cell(I_TRAPS + k as u32), 4, &format!("docs/img/icons/{}.png", t.id())); } - for (k, s) in crate::spells::SPELLS.iter().enumerate() { - save(&atlas, Gfx::cell(I_SPELLS + k as u32), 4, &format!("docs/img/icons/{}.png", s.id())); + for s in crate::spells::SPELLS.iter() { + save(&atlas, Gfx::cell(crate::spells::spell_icon(*s)), 4, &format!("docs/img/icons/{}.png", s.id())); } for (id, cell) in [("lightning", I_BOLT), ("heal", I_HEAL), ("summon", I_SUMMON), ("arrow", I_ARROW), ("cannon", I_CANNON), ("magic", I_MAGIC), ("rune", I_RUNE)] { save(&atlas, Gfx::cell(cell), 4, &format!("docs/img/icons/{}.png", id)); diff --git a/src/main.rs b/src/main.rs index 91c3166..e6607b6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -107,7 +107,7 @@ fn tool_tile(cam: &Cam, map: &map::Map, tool: Tool, mx: f32, my: f32) -> Option< } fn area_tool(t: Tool) -> bool { - matches!(t, Tool::Dig | Tool::Room(_) | Tool::Sell | Tool::Bridge | Tool::Steel) + matches!(t, Tool::Dig | Tool::Room(_) | Tool::Sell | Tool::Bridge | Tool::Steel | Tool::Drawbridge) } // Use the active tool on the world at (mx, my) (CSS pixels): a click, or a tap on touch screens @@ -120,7 +120,7 @@ fn world_action(app: &mut App, ui: &mut Ui, r3d: &R3d, inp: &mut Input, mx: f32, let ground = app.cam.ground_point(mx, my); let (wx, wy) = (ground.x, ground.y); match (ui.tool, tile) { - (Tool::Dig | Tool::Room(_) | Tool::Sell | Tool::Bridge | Tool::Steel, Some(t)) => inp.ldown = Some(t), + (Tool::Dig | Tool::Room(_) | Tool::Sell | Tool::Bridge | Tool::Steel | Tool::Drawbridge, Some(t)) => inp.ldown = Some(t), (Tool::Hand, _) => { let j = r3d.pick_ent(&app.game, &app.cam, mx, my, false); let Some(j) = j else { return }; @@ -163,6 +163,7 @@ fn finish_rect(app: &mut App, tool: Tool, start: (i32, i32), mx: f32, my: f32) { Tool::Room(room) => app.game.queue(Act::Room { room: room as u8, r }), Tool::Sell => app.game.queue(Act::Sell(r)), Tool::Bridge => app.game.queue(Act::Bridge(r)), + Tool::Drawbridge => app.game.queue(Act::Drawbridge(r)), Tool::Steel => app.game.queue(Act::Steel(r)), _ => {} } @@ -1946,7 +1947,7 @@ fn draw_frame(app: &mut App, gfx: &Gfx, r3d: &mut R3d, ui: &mut Ui, menu: &mut M Tool::Lightning => (Color::new(1.0, 1.0, 0.6, 1.0), Some((ground.x, ground.y, 1.6))), Tool::Heal => (Color::new(0.4, 1.0, 0.5, 1.0), Some((ground.x, ground.y, 2.55))), Tool::Summon => (Color::new(0.8, 0.5, 1.0, 1.0), None), - Tool::Bridge => (Color::new(0.9, 0.7, 0.4, 1.0), None), + Tool::Bridge | Tool::Drawbridge => (Color::new(0.9, 0.7, 0.4, 1.0), None), Tool::Steel => (Color::new(0.75, 0.8, 0.9, 1.0), None), Tool::Tower(_) => (Color::new(1.0, 0.6, 0.25, 1.0), None), Tool::Trap(_) => (Color::new(1.0, 0.4, 0.3, 1.0), None), diff --git a/src/map.rs b/src/map.rs index 864f2a7..98dffc1 100644 --- a/src/map.rs +++ b/src/map.rs @@ -68,8 +68,15 @@ pub enum Kind { GuardPost, // room: creatures hold the position Arena, // room: sparring Altar, // room: sacrifices + Drawbridge, // bridge that can be raised (res: see DB_RAISED, DB_AUTO, DB_LAVA) + Obsidian, // lava cooled by frost: walkable until it melts again } +// drawbridge state in Tile::res +pub const DB_RAISED: u8 = 1; // raised: nobody can cross +pub const DB_AUTO: u8 = 2; // rises by itself when enemies come near +pub const DB_LAVA: u8 = 4; // spans lava (stone), else water (wood) + // options for the map generator (campaign missions) #[derive(Clone, Debug)] pub struct GenOpts { @@ -96,7 +103,7 @@ pub struct River { } // order matters for the packed savegame codec: only append new kinds -const KINDS: [Kind; 34] = [ +const KINDS: [Kind; 36] = [ Kind::Rock, Kind::Earth, Kind::Gold, @@ -131,6 +138,8 @@ const KINDS: [Kind; 34] = [ Kind::GuardPost, Kind::Arena, Kind::Altar, + Kind::Drawbridge, + Kind::Obsidian, ]; // treasures (veins, treasury content, imp loads): 0 gold, 1 silver, 2 ruby, 3 diamond @@ -151,6 +160,18 @@ pub enum Owner { const OWNERS: [Owner; 6] = [Owner::None, Owner::Player, Owner::Hero, Owner::Rival1, Owner::Rival2, Owner::Rival3]; impl Owner { + // the side of a ground owner (255: nobody) + pub fn side(self) -> u8 { + match self { + Owner::Player => 0, + Owner::Hero => 1, + Owner::Rival1 => 2, + Owner::Rival2 => 3, + Owner::Rival3 => 4, + Owner::None => 255, + } + } + pub fn of_side(side: u8) -> Owner { match side { 0 => Owner::Player, @@ -240,20 +261,26 @@ impl Tile { | Kind::GuardPost | Kind::Arena | Kind::Altar - ) + | Kind::Obsidian + ) || (self.kind == Kind::Drawbridge && self.res & DB_RAISED == 0) } // river tiles (open, but nobody can walk there) pub fn liquid(&self) -> bool { matches!(self.kind, Kind::Water | Kind::Lava) } pub fn bridge(&self) -> bool { - matches!(self.kind, Kind::Bridge | Kind::LavaBridge) + matches!(self.kind, Kind::Bridge | Kind::LavaBridge | Kind::Drawbridge) } - // the river below a bridge or river tile + pub fn raised(&self) -> bool { + self.kind == Kind::Drawbridge && self.res & DB_RAISED != 0 + } + // the river below a bridge or river tile (obsidian: the lava under the crust) pub fn river(&self) -> Option { match self.kind { Kind::Water | Kind::Bridge => Some(Kind::Water), - Kind::Lava | Kind::LavaBridge => Some(Kind::Lava), + Kind::Lava | Kind::LavaBridge | Kind::Obsidian => Some(Kind::Lava), + Kind::Drawbridge if self.res & DB_LAVA != 0 => Some(Kind::Lava), + Kind::Drawbridge => Some(Kind::Water), _ => None, } } diff --git a/src/menu/bestiary.rs b/src/menu/bestiary.rs index 50ae1f4..3abbace 100644 --- a/src/menu/bestiary.rs +++ b/src/menu/bestiary.rs @@ -10,7 +10,7 @@ pub const TABS: [&str; 4] = ["best.tab.creatures", "best.tab.humans", "best.tab. const CREATURES: [EK; 14] = [EK::Worker, EK::Kobold, EK::Spider, EK::Mage, EK::Ogre, EK::Jailer, EK::Priestess, EK::Chainbreaker, EK::Cogling, EK::Revenant, EK::Bat, EK::Gargoyle, EK::Owl, EK::Wyrm]; const HUMANS: [EK; 8] = [EK::Knight, EK::Archer, EK::Priest, EK::Dwarf, EK::Fairy, EK::BattleMage, EK::Giant, EK::Paladin]; // buildings: indices into ui::TOOLS -const BUILDINGS: [usize; 30] = [2, 3, 4, 5, 6, 12, 40, 13, 18, 21, 41, 42, 43, 44, 17, 19, 14, 15, 16, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]; +const BUILDINGS: [usize; 31] = [2, 3, 4, 5, 6, 12, 40, 13, 18, 21, 41, 42, 43, 44, 17, 47, 19, 14, 15, 16, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]; #[derive(Clone, Copy)] enum Entry { @@ -266,6 +266,7 @@ impl Menu { crate::ui::Tool::Room(r) => crate::game::ROOM_NAMES[r].trim_start_matches("room.").to_string(), crate::ui::Tool::Tower(k) => crate::game::tower_name(k).trim_start_matches("tower.").to_string(), crate::ui::Tool::Bridge => "bridge".into(), + crate::ui::Tool::Drawbridge => "drawbridge".into(), crate::ui::Tool::Trap(k) => k.id().into(), _ => "steel".into(), }; diff --git a/src/render3d.rs b/src/render3d.rs index f6a8883..5544431 100644 --- a/src/render3d.rs +++ b/src/render3d.rs @@ -722,12 +722,54 @@ fn build_chunk(map: &Map, amb: &[f32], glow: &[f32], cx: i32, cz: i32, atlas: &T [inward; 4], ); } + if t.kind == Kind::Obsidian { + // a crust of cooled lava just above the glowing river + let (oa, ob) = cell_uv(T_OBSIDIAN + (t.var as u32 & 3)); + let oc = col(lava_lit(Vec3::splat(amb_at(amb, xf + 0.5, zf + 0.5).max(0.45)), lg), 1.0); + let y = -0.02; + mb.quad([vec3(xf, y, zf), vec3(xf + 1.0, y, zf), vec3(xf + 1.0, y, zf + 1.0), vec3(xf, y, zf + 1.0)], [vec2(oa.x, oa.y), vec2(ob.x, oa.y), vec2(ob.x, ob.y), vec2(oa.x, ob.y)], [oc; 4], [Vec3::Y; 4]); + continue; + } + if t.raised() { + // a raised drawbridge: the flap stands upright at the bank it is hinged on + let tex = if lava { T_STONEBRIDGE } else { T_BRIDGE }; + let (ba, bb) = cell_uv(tex); + let fc = col(lava_lit(Vec3::splat(amb_at(amb, xf + 0.5, zf + 0.5).max(if lava { 0.6 } else { 0.0 }) * 0.85), lg), 1.0); + for (d, &(dx, dz)) in DIR4.iter().enumerate() { + if !map.get(x + dx, z + dz).map_or(false, |o| o.walkable() && !o.bridge()) { + continue; + } + // the hinge edge, from p to q + let (p, q) = match d { + 0 => (vec3(xf, 0.0, zf), vec3(xf + 1.0, 0.0, zf)), + 1 => (vec3(xf + 1.0, 0.0, zf), vec3(xf + 1.0, 0.0, zf + 1.0)), + 2 => (vec3(xf + 1.0, 0.0, zf + 1.0), vec3(xf, 0.0, zf + 1.0)), + _ => (vec3(xf, 0.0, zf + 1.0), vec3(xf, 0.0, zf)), + }; + let inward = vec3(-dx as f32, 0.0, -dz as f32); + let off = inward * 0.12; + let up = Vec3::Y * 1.0; + // both faces of the flap, a little in front of the bank + mb.quad([p + off, q + off, q + off + up, p + off + up], [vec2(ba.x, bb.y), vec2(bb.x, bb.y), vec2(bb.x, ba.y), vec2(ba.x, ba.y)], [fc; 4], [inward; 4]); + mb.quad([q + off, p + off, p + off + up, q + off + up], [vec2(ba.x, bb.y), vec2(bb.x, bb.y), vec2(bb.x, ba.y), vec2(ba.x, ba.y)], [fc; 4], [-inward; 4]); + ln.strip(p + off + up, q + off + up, inward, OUTLINE_W, OUTLINE_C); + // the chains from the top of the flap down to the bank + let chain = col(Vec3::splat(0.55), 1.0); + for e in [p, q] { + let a = e + off + up + (if e == p { (q - p) * 0.1 } else { (p - q) * 0.1 }); + let b = e - inward * 0.6 + Vec3::Y * 1.3; + ln.strip(a, b, inward, OUTLINE_W * 0.7, chain); + } + } + continue; + } if t.bridge() { // deck: planks across the direction of the bridge, rails along it let run_x = |dx: i32| map.get(x + dx, z).map_or(false, |o| o.bridge() || (o.walkable() && !o.bridge())); let run_z = |dz: i32| map.get(x, z + dz).map_or(false, |o| o.bridge() || (o.walkable() && !o.bridge())); let along_x = (run_x(-1) as i32 + run_x(1) as i32) > (run_z(-1) as i32 + run_z(1) as i32); - let (ba, bb) = cell_uv(tex); + // a drawbridge over lava is made of stone + let (ba, bb) = cell_uv(if t.kind == Kind::Drawbridge && lava { T_STONEBRIDGE + (t.var as u32 & 1) } else { tex }); let dc = col(lava_lit(Vec3::splat(amb_at(amb, xf + 0.5, zf + 0.5).max(if lava { 0.6 } else { 0.0 })), lg), 1.0); let uv = if along_x { [vec2(ba.x, ba.y), vec2(ba.x, bb.y), vec2(bb.x, bb.y), vec2(bb.x, ba.y)] @@ -735,6 +777,14 @@ fn build_chunk(map: &Map, amb: &[f32], glow: &[f32], cx: i32, cz: i32, atlas: &T [vec2(ba.x, ba.y), vec2(bb.x, ba.y), vec2(bb.x, bb.y), vec2(ba.x, bb.y)] }; mb.quad([vec3(xf, DECK_Y, zf), vec3(xf + 1.0, DECK_Y, zf), vec3(xf + 1.0, DECK_Y, zf + 1.0), vec3(xf, DECK_Y, zf + 1.0)], uv, [dc; 4], [Vec3::Y; 4]); + if t.kind == Kind::Drawbridge { + // iron bands across the planks mark a drawbridge + let iron = col(Vec3::splat(0.32), 1.0); + for f in [0.18, 0.82] { + let (a, b) = if along_x { (vec3(xf + f, DECK_Y + 0.005, zf), vec3(xf + f, DECK_Y + 0.005, zf + 1.0)) } else { (vec3(xf, DECK_Y + 0.005, zf + f), vec3(xf + 1.0, DECK_Y + 0.005, zf + f)) }; + ln.strip(a, b, Vec3::Y, OUTLINE_W * 1.6, iron); + } + } // deck edges above open river for (d, &(dx, dz)) in DIR4.iter().enumerate() { if !map.get(x + dx, z + dz).map_or(false, |o| o.liquid()) { @@ -994,6 +1044,7 @@ fn chunk_sig(map: &Map, cx: i32, cz: i32) -> u64 { let extra = match t.kind { Kind::Farm => t.food as u64, Kind::Treasury => (t.gold / 50) as u64 | (t.res as u64) << 5, + Kind::Drawbridge => t.res as u64, _ => 0, }; let shown = map.shown(idx(x, z)) as u64; @@ -3030,6 +3081,8 @@ pub fn minimap_color(tile: &Tile) -> [u8; 4] { Kind::Lava => [250, 110, 30, 255], Kind::Bridge => [150, 110, 60, 255], Kind::LavaBridge => [130, 120, 115, 255], + Kind::Drawbridge => [120, 80, 50, 255], + Kind::Obsidian => [60, 40, 70, 255], Kind::Shard => [255, 60, 120, 255], Kind::Aerie => [170, 140, 90, 255], Kind::Steel => [150, 160, 180, 255], diff --git a/src/research.rs b/src/research.rs index 7718d50..23b5cc9 100644 --- a/src/research.rs +++ b/src/research.rs @@ -34,7 +34,9 @@ pub const RESEARCH: &[(usize, f32)] = &[ (25, 650.0), // stone roller (37, 700.0), // invisibility (19, 700.0), // steel walls + (47, 700.0), // drawbridge (28, 800.0), // frost glow + (48, 800.0), // frost spell (38, 850.0), // plague (27, 900.0), // rune mine (39, 950.0), // quake diff --git a/src/scenes.rs b/src/scenes.rs index 84e8b40..e2fa5d7 100644 --- a/src/scenes.rs +++ b/src/scenes.rs @@ -162,4 +162,31 @@ fn export_scenes() { g.place_all_torches(); run(&mut g, 4.0); save("lava-light", &mut g, cx as f32 + 5.0, cy as f32, 22.0, 0.0, false); + + // bridges: a raised and a lowered drawbridge over water, a burning bridge, obsidian on lava + let mut g = Game::new(17, 80, 64); + let (cx, cy) = g.map.core; + g.gold = 50000.0; + open(&mut g, cx - 6, cy - 9, cx + 18, cy + 9); + for y in cy - 9..=cy + 9 { + for x in cx + 6..cx + 9 { + let t = &mut g.map.t[idx(x, y)]; + t.kind = Kind::Water; + t.owner = Owner::None; + } + for x in cx + 12..cx + 15 { + let t = &mut g.map.t[idx(x, y)]; + t.kind = Kind::Lava; + t.owner = Owner::None; + } + } + g.drawbridge_order(cx + 5, cy - 5, cx + 9, cy - 5); + g.drawbridge_order(cx + 5, cy - 1, cx + 9, cy - 1); + g.drawbridge_order(cx + 6, cy - 1, cx + 6, cy - 1); // raised + g.build_bridges(cx + 5, cy + 4, cx + 9, cy + 4); + g.ignite_at(cx as f32 + 7.5, cy as f32 + 4.5); + g.cool_lava_around(cx as f32 + 13.5, cy as f32 + 1.5, 2.5, 60.0); + g.place_all_torches(); + run(&mut g, 2.5); + save("bridges", &mut g, cx as f32 + 9.0, cy as f32, 18.0, 0.0, false); } diff --git a/src/spells.rs b/src/spells.rs index 32ddc89..6439ab4 100644 --- a/src/spells.rs +++ b/src/spells.rs @@ -16,9 +16,18 @@ pub enum Spell { Invisible, Plague, Quake, + Freeze, // frost: cools lava into obsidian, chills enemies } -pub const SPELLS: [Spell; 8] = [Spell::Eye, Spell::CaveIn, Spell::Haste, Spell::Stoneskin, Spell::GoldRain, Spell::Invisible, Spell::Plague, Spell::Quake]; +pub const SPELLS: [Spell; 9] = [Spell::Eye, Spell::CaveIn, Spell::Haste, Spell::Stoneskin, Spell::GoldRain, Spell::Invisible, Spell::Plague, Spell::Quake, Spell::Freeze]; + +// the icon of a spell (the first eight share one row of the atlas) +pub fn spell_icon(sp: Spell) -> u32 { + match SPELLS.iter().position(|&t| t == sp).unwrap_or(0) { + k if k < 8 => crate::gfx::I_SPELLS + k as u32, + _ => crate::gfx::I_FREEZE, + } +} pub const EYE_TIME: f32 = 20.0; pub const EYE_RADIUS: f32 = 8.0; @@ -34,6 +43,7 @@ impl Spell { Spell::Invisible => 50.0, Spell::Plague => 80.0, Spell::Quake => 90.0, + Spell::Freeze => 80.0, } } // radius shown under the pointer @@ -43,6 +53,7 @@ impl Spell { Spell::CaveIn => 1.5, Spell::Plague => 2.0, Spell::Quake => 3.0, + Spell::Freeze => 2.5, Spell::GoldRain => 0.0, _ => 1.6, } @@ -57,6 +68,7 @@ impl Spell { Spell::Invisible => "invisible", Spell::Plague => "plague", Spell::Quake => "quake", + Spell::Freeze => "freeze", } } } @@ -232,6 +244,23 @@ impl Game { } self.sfx(Sfx::Cannon, wx, wy); } + Spell::Freeze => { + // lava turns to obsidian for a while; enemies are chilled and slowed + self.cool_lava_around(wx, wy, 2.5, crate::bridges::FREEZE_TIME); + let hit: Vec = (0..self.ents.len()).filter(|&j| foe(&self.ents[j]) && near(&self.ents[j])).collect(); + for j in hit { + let e = &mut self.ents[j]; + e.hp -= 20.0; + e.slow = e.slow.max(4.0); + e.flash = 0.15; + if e.hp <= 0.0 { + self.kill(j); + } + } + self.part(RING, (wx, wy, 0.05), (0.0, 0.0, 0.0), 0.6, abgr(170, 230, 255), 2.5); + self.sparkle(wx, wy, 24, abgr(200, 240, 255)); + self.sfx(Sfx::Magic, wx, wy); + } } self.mana -= cost; } diff --git a/src/traps.rs b/src/traps.rs index 7cc6b48..6f5c645 100644 --- a/src/traps.rs +++ b/src/traps.rs @@ -485,7 +485,8 @@ impl Game { let near = |r: f32, ents: &Vec| -> Vec { (0..ents.len()).filter(|&j| enemy(&ents[j]) && (ents[j].x - cx).powi(2) + (ents[j].y - cy).powi(2) < r * r).collect() }; match t.kind { TrapKind::Frost => { - // always on: cold around it slows and bites + // always on: cold around it slows and bites, and keeps lava next to it cooled + self.cool_lava_around(cx, cy, 2.5, 3.0); for j in near(2.5, &self.ents) { self.ents[j].slow = self.ents[j].slow.max(0.5); self.damage_unit(j, 2.0 * dt); diff --git a/src/ui.rs b/src/ui.rs index 3a3df73..eacd4f2 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -174,13 +174,14 @@ pub enum Tool { Tower(TowerKind), Bridge, Steel, + Drawbridge, Trap(crate::traps::TrapKind), Spell(crate::spells::Spell), Order(u8), // 0 attack, 1 guard } // New tools are appended so that existing key bindings ("tool") keep their meaning -pub const TOOLS: [Tool; 47] = [ +pub const TOOLS: [Tool; 49] = [ Tool::Dig, Tool::Hand, Tool::Room(0), @@ -228,6 +229,8 @@ pub const TOOLS: [Tool; 47] = [ Tool::Room(13), Tool::Order(0), Tool::Order(1), + Tool::Drawbridge, + Tool::Spell(crate::spells::Spell::Freeze), ]; @@ -259,7 +262,7 @@ pub fn tool_info(t: Tool) -> ToolInfo { Tool::Trap(k) => (k.id(), I_TRAPS + crate::traps::TRAP_KINDS.iter().position(|&t| t == k).unwrap_or(0) as u32, None), Tool::Order(0) => ("order_attack", I_ORDERS, None), Tool::Order(_) => ("order_guard", I_ORDERS + 1, None), - Tool::Spell(sp) => (sp.id(), I_SPELLS + crate::spells::SPELLS.iter().position(|&t| t == sp).unwrap_or(0) as u32, None), + Tool::Spell(sp) => (sp.id(), crate::spells::spell_icon(sp), None), Tool::Tower(TowerKind::Arrow) => ("arrow", I_ARROW, None), Tool::Tower(TowerKind::Cannon) => ("cannon", I_CANNON, None), Tool::Tower(TowerKind::Magic) => ("magic", I_MAGIC, None), @@ -270,6 +273,7 @@ pub fn tool_info(t: Tool) -> ToolInfo { Tool::Heal => ("heal", I_HEAL, None), Tool::Summon => ("summon", I_SUMMON, None), Tool::Bridge => ("bridge", I_BRIDGE, None), + Tool::Drawbridge => ("drawbridge", I_DRAWBRIDGE, None), Tool::Steel => ("steel", I_STEEL, None), }; let name = match room { @@ -285,6 +289,7 @@ pub fn tool_cost_static(t: Tool) -> String { Tool::Spell(sp) => trf("cost.mana", &[(sp.cost() as i32).to_string()]), Tool::Trap(k) => trf("cost.work", &[(k.work() as i32).to_string()]), Tool::Bridge => trf("cost.bridge", &[BRIDGE_COST[0].to_string(), BRIDGE_COST[1].to_string()]), + Tool::Drawbridge => trf("cost.gold_tile", &[DRAWBRIDGE_COST.to_string()]), Tool::Steel => trf("cost.steel", &[STEEL_COST[0].to_string(), STEEL_COST[1].to_string()]), Tool::Tower(TowerKind::Rune) => { let s = tower_stats(TowerKind::Rune); @@ -310,6 +315,7 @@ pub fn tool_cost(t: Tool, g: &Game) -> String { Tool::Heal => trf("cost.mana", &["60".into()]), Tool::Summon => trf("cost.mana", &[(g.summon_cost() as i32).to_string()]), Tool::Bridge => trf("cost.bridge", &[BRIDGE_COST[0].to_string(), BRIDGE_COST[1].to_string()]), + Tool::Drawbridge => trf("cost.gold_tile", &[DRAWBRIDGE_COST.to_string()]), Tool::Steel => trf("cost.steel", &[STEEL_COST[0].to_string(), STEEL_COST[1].to_string()]), Tool::Tower(TowerKind::Rune) => { let s = tower_stats(TowerKind::Rune); @@ -331,10 +337,10 @@ pub fn tool_cost(t: Tool, g: &Game) -> String { pub const CATS: [(&str, &[usize]); 7] = [ ("cat.dig", &[0]), ("cat.hand", &[1]), - ("cat.rooms", &[2, 3, 4, 5, 6, 12, 40, 13, 18, 21, 41, 42, 43, 44, 17]), + ("cat.rooms", &[2, 3, 4, 5, 6, 12, 40, 13, 18, 21, 41, 42, 43, 44, 17, 47]), ("cat.towers", &[14, 15, 16, 20]), ("cat.traps", &[22, 23, 24, 25, 26, 27, 28, 29, 30, 31]), - ("cat.spells", &[9, 10, 11, 32, 33, 34, 35, 36, 37, 38, 39]), + ("cat.spells", &[9, 10, 11, 32, 33, 34, 35, 36, 37, 38, 39, 48]), ("cat.orders", &[8, 45, 46, 7, 19]), ]; @@ -1412,6 +1418,17 @@ impl Ui { } // Info text for the unit or tile under the mouse (first line = title) +// fire and wear of a bridge tile +fn bridge_state(g: &Game, i: usize, out: &mut Vec<(String, Color)>) { + if g.burning(i) { + out.push((tr("tile.bridge_burning"), RED)); + } + let w = g.wear_of(i); + if w > 0.0 { + out.push((trf("tile.bridge_worn", &[((w * 100.0) as i32).to_string()]), GOLD)); + } +} + pub fn hover_info(g: &Game, ent: Option, tile: Option<(i32, i32)>) -> Vec<(String, Color)> { let mut out = Vec::new(); if let Some(j) = ent { @@ -1475,6 +1492,7 @@ pub fn hover_info(g: &Game, ent: Option, tile: Option<(i32, i32)>) -> Vec return out; } let Some(t) = g.map.get(x, y) else { return out }; + let i = idx(x, y); let owner = match t.owner { Owner::Player => "owner.player", Owner::Hero => "owner.hero", @@ -1532,6 +1550,25 @@ pub fn hover_info(g: &Game, ent: Option, tile: Option<(i32, i32)>) -> Vec Kind::Bridge | Kind::LavaBridge => { out.push((tr(if t.kind == Kind::Bridge { "tile.bridge" } else { "tile.lavabridge" }), FRAME_HI)); out.push((tr(owner), DIM)); + bridge_state(g, i, &mut out); + } + Kind::Drawbridge => { + out.push((tr("tile.drawbridge"), FRAME_HI)); + out.push((tr(owner), DIM)); + let state = if t.res & DB_AUTO != 0 { + if t.raised() { "tile.drawbridge_auto_up" } else { "tile.drawbridge_auto" } + } else if t.raised() { + "tile.drawbridge_up" + } else { + "tile.drawbridge_down" + }; + out.push((tr(state), BLUE)); + bridge_state(g, i, &mut out); + } + Kind::Obsidian => { + out.push((tr("tile.obsidian"), FRAME_HI)); + let left = g.bridgework.cooled.iter().find(|c| c.0 == i).map_or(0.0, |c| c.1); + out.push((trf("tile.obsidian_info", &[(left.ceil() as i32).to_string()]), if left < crate::bridges::MELT_WARN { RED } else { DIM })); } Kind::Shard => { out.push((tr("tile.shard"), RED));