diff --git a/lang/cs.lang b/lang/cs.lang index 9e97c5e..97ea63b 100644 --- a/lang/cs.lang +++ b/lang/cs.lang @@ -313,6 +313,7 @@ hint.tower_max = Tato věž je plně vylepšená. hint.tower_where = Věže lze stavět jen na zabraných prázdných políčkách podlahy. hint.tower_mana = Tvým magickým věžím došla mana. job.repair = Opravuje věž +job.mend_bridge = Opravuje most job.attack_tower = Útočí na věž unit.jailer = Žalářník @@ -400,6 +401,7 @@ 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í. 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ří. hint.bridge_river = Mosty lze stavět jen přes vodu nebo lávu. msg.hero_burned = Do lávy spadl hrdina: {0}! +{1} zlata. msg.creature_burned = Do lávy spadl tvůj tvor: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Rytířská stavba padla: {0}! 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ří! job.tear_bridge = Strhává most job.patrol = Na hlídce job.guard = Na stráži diff --git a/lang/da.lang b/lang/da.lang index 7aab002..1aa7854 100644 --- a/lang/da.lang +++ b/lang/da.lang @@ -313,6 +313,7 @@ hint.tower_max = Dette tårn er fuldt opgraderet. hint.tower_where = Tårne kan kun bygges på indtagne, tomme gulvfelter. hint.tower_mana = Dine magitårne er løbet tør for mana. job.repair = Reparerer et tårn +job.mend_bridge = Reparerer en bro job.attack_tower = Angriber et tårn unit.jailer = Fangevogter @@ -399,6 +400,7 @@ 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. 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. hint.bridge_river = Broer kan kun bygges over vand eller lava. msg.hero_burned = En {0} faldt i lavaen! +{1} guld. msg.creature_burned = Din {0} faldt i lavaen. @@ -429,6 +431,7 @@ msg.enemy_tower_destroyed = Et af riddernes tårne er faldet: {0}! 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! job.tear_bridge = River en bro ned job.patrol = På patrulje job.guard = På vagt diff --git a/lang/de.lang b/lang/de.lang index ae2dee7..06d6025 100644 --- a/lang/de.lang +++ b/lang/de.lang @@ -312,6 +312,7 @@ hint.tower_max = Dieser Turm ist voll ausgebaut. hint.tower_where = Türme können nur auf eroberten, leeren Bodenfeldern gebaut werden. hint.tower_mana = Deinen Magietürmen ist das Mana ausgegangen. job.repair = Repariert einen Turm +job.mend_bridge = Flickt eine Brücke job.attack_tower = Greift einen Turm an unit.jailer = Kerkermeister @@ -399,6 +400,7 @@ 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. 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. hint.bridge_river = Brücken lassen sich nur über Wasser oder Lava bauen. msg.hero_burned = Ein {0} ist in die Lava gefallen! +{1} Gold. msg.creature_burned = Dein {0} ist in die Lava gefallen. @@ -429,6 +431,7 @@ msg.enemy_tower_destroyed = Ein Ritter-{0} ist gefallen! 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! job.tear_bridge = Reißt eine Brücke ein job.patrol = Auf Patrouille job.guard = Hält Wache diff --git a/lang/el.lang b/lang/el.lang index a114b85..6e018fc 100644 --- a/lang/el.lang +++ b/lang/el.lang @@ -313,6 +313,7 @@ hint.tower_max = Αυτός ο πύργος είναι πλήρως αναβαθ hint.tower_where = Πύργοι χτίζονται μόνο σε κατακτημένα, άδεια πλακίδια δαπέδου. hint.tower_mana = Οι πύργοι μαγείας σου ξέμειναν από μάνα. job.repair = Επισκευάζει πύργο +job.mend_bridge = Επισκευάζει γέφυρα job.attack_tower = Επιτίθεται σε πύργο unit.jailer = Δεσμοφύλακας @@ -400,6 +401,7 @@ tool.bridge.name = Χτίσιμο Γέφυρας tool.bridge.desc = Χτίζει γέφυρα πάνω από νερό ή λάβα. Σύρε από το δικό σου έδαφος πέρα από το ποτάμι, η γέφυρα μεγαλώνει πλακίδιο-πλακίδιο από την επικράτειά σου. cost.bridge = {0} χρυσός/πλακίδιο πάνω από νερό, {1} πάνω από λάβα hint.bridge_where = Οι γέφυρες ξεκινούν από το δικό σου έδαφος: σύρε από την επικράτειά σου πέρα από το ποτάμι. +hint.bridge_fire = Οι ξύλινες γέφυρες καίγονται: κράτα μακριά παγίδες φωτιάς, πύρινη ανάσα και κεραυνούς – οι πέτρινες γέφυρες πάνω από λάβα δεν καίγονται. hint.bridge_river = Γέφυρες χτίζονται μόνο πάνω από νερό ή λάβα. msg.hero_burned = Έπεσε στη λάβα: {0}! +{1} χρυσός. msg.creature_burned = Έπεσε στη λάβα: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Έπεσε ιπποτικός πύργος: {0}! msg.vault_taken = Ιπποτικό θησαυροφυλάκιο κατελήφθη: θησαυρός αξίας {0} είναι δικός σου. msg.shard_taken = Ένα θραύσμα του πυρήνα ψυχής σου είναι ξανά στα χέρια σου! msg.bridge_torn = Οι ιππότες γκρέμισαν μία από τις γέφυρές σου! +msg.bridge_fire = Μια από τις γέφυρές σου καίγεται! job.tear_bridge = Γκρεμίζει γέφυρα job.patrol = Σε περιπολία job.guard = Σε φρουρά diff --git a/lang/en.lang b/lang/en.lang index 5a70ea3..b6a0787 100644 --- a/lang/en.lang +++ b/lang/en.lang @@ -313,6 +313,7 @@ hint.tower_max = This tower is fully upgraded. hint.tower_where = Towers can only be built on claimed, empty floor tiles. hint.tower_mana = Your magic towers have run out of mana. job.repair = Repairing a tower +job.mend_bridge = Mending a bridge job.attack_tower = Attacking a tower unit.jailer = Jailer @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Bridges can only be built over water or lava. msg.hero_burned = A {0} fell into the lava! +{1} gold. msg.creature_burned = Your {0} fell into the lava. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = A knight {0} has fallen! 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! job.tear_bridge = Tearing down a bridge job.patrol = On patrol job.guard = On guard diff --git a/lang/es.lang b/lang/es.lang index 6f80952..719f0a1 100644 --- a/lang/es.lang +++ b/lang/es.lang @@ -313,6 +313,7 @@ hint.tower_max = Esta torre ya está mejorada al máximo. hint.tower_where = Las torres solo pueden construirse en casillas de suelo reclamadas y vacías. hint.tower_mana = Tus torres mágicas se han quedado sin maná. job.repair = Reparando una torre +job.mend_bridge = Repara un puente job.attack_tower = Atacando una torre unit.jailer = Carcelero @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Los puentes solo pueden construirse sobre agua o lava. msg.hero_burned = ¡Un {0} ha caído en la lava! +{1} de oro. msg.creature_burned = Tu {0} ha caído en la lava. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = ¡Ha caído una {0} de los caballeros! 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! job.tear_bridge = Derribando un puente job.patrol = De patrulla job.guard = De guardia diff --git a/lang/fi.lang b/lang/fi.lang index 75cc1e4..22bdb80 100644 --- a/lang/fi.lang +++ b/lang/fi.lang @@ -313,6 +313,7 @@ hint.tower_max = Tämä torni on täysin parannettu. hint.tower_where = Torneja voi rakentaa vain vallatuille, tyhjille lattiaruuduille. hint.tower_mana = Taikatorneiltasi on loppunut mana. job.repair = Korjaa tornia +job.mend_bridge = Korjaa siltaa job.attack_tower = Hyökkää tornia vastaan unit.jailer = Vanginvartija @@ -400,6 +401,7 @@ tool.bridge.name = Rakenna silta tool.bridge.desc = Rakentaa sillan veden tai laavan yli. Vedä omalta maaltasi joen yli; silta kasvaa ruutu kerrallaan alueeltasi. 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. hint.bridge_river = Siltoja voi rakentaa vain veden tai laavan yli. msg.hero_burned = Laavaan putosi: {0}! +{1} kultaa. msg.creature_burned = Olentosi putosi laavaan: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Ritarien torni kaatui: {0}! 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! job.tear_bridge = Purkaa siltaa job.patrol = Partiossa job.guard = Vartiossa diff --git a/lang/hr.lang b/lang/hr.lang index 7407e58..31311f7 100644 --- a/lang/hr.lang +++ b/lang/hr.lang @@ -313,6 +313,7 @@ hint.tower_max = Ovaj toranj je potpuno nadograđen. hint.tower_where = Tornjevi se grade samo na osvojenim, praznim podnim poljima. hint.tower_mana = Tvojim čarobnim tornjevima ponestalo je mane. job.repair = Popravlja toranj +job.mend_bridge = Popravlja most job.attack_tower = Napada toranj unit.jailer = Tamničar @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Mostovi se grade samo preko vode ili lave. msg.hero_burned = Pao je u lavu: {0}! +{1} zlata. msg.creature_burned = Tvoje stvorenje palo je u lavu: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Pao je viteški toranj: {0}! 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! job.tear_bridge = Ruši most job.patrol = U ophodnji job.guard = Na straži diff --git a/lang/hu.lang b/lang/hu.lang index c15133b..0b31d21 100644 --- a/lang/hu.lang +++ b/lang/hu.lang @@ -313,6 +313,7 @@ hint.tower_max = Ez a torony teljesen ki van fejlesztve. hint.tower_where = Tornyot csak elfoglalt, üres padlómezőre lehet építeni. hint.tower_mana = A mágiatornyaidból kifogyott a mana. job.repair = Tornyot javít +job.mend_bridge = Hidat javít job.attack_tower = Tornyot támad unit.jailer = Börtönőr @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Hidat csak víz vagy láva fölé lehet építeni. msg.hero_burned = Hős esett a lávába: {0}! +{1} arany. msg.creature_burned = Lényed esett a lávába: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Elesett egy lovagi torony: {0}! 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! job.tear_bridge = Hidat rombol job.patrol = Járőrözik job.guard = Őrt áll diff --git a/lang/it.lang b/lang/it.lang index bf57ff7..e9cb9a7 100644 --- a/lang/it.lang +++ b/lang/it.lang @@ -313,6 +313,7 @@ hint.tower_max = Questa torre è al massimo potenziamento. hint.tower_where = Le torri si costruiscono solo su caselle di pavimento conquistate e vuote. hint.tower_mana = Le tue torri magiche sono rimaste senza mana. job.repair = Ripara una torre +job.mend_bridge = Ripara un ponte job.attack_tower = Attacca una torre unit.jailer = Carceriere @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = I ponti si costruiscono solo su acqua o lava. msg.hero_burned = Un eroe è caduto nella lava: {0}! +{1} oro. msg.creature_burned = È caduto nella lava: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = È caduta una {0} dei cavalieri! 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! job.tear_bridge = Abbatte un ponte job.patrol = Di pattuglia job.guard = Di guardia diff --git a/lang/nl.lang b/lang/nl.lang index 480be00..ab6ee89 100644 --- a/lang/nl.lang +++ b/lang/nl.lang @@ -313,6 +313,7 @@ hint.tower_max = Deze toren is volledig verbeterd. hint.tower_where = Torens kun je alleen op ingenomen, lege vloervakken bouwen. hint.tower_mana = Je magietorens hebben geen mana meer. job.repair = Repareert een toren +job.mend_bridge = Herstelt een brug job.attack_tower = Valt een toren aan unit.jailer = Cipier @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Bruggen kun je alleen over water of lava bouwen. msg.hero_burned = Een {0} is in de lava gevallen! +{1} goud. msg.creature_burned = Je {0} is in de lava gevallen. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Een {0} van de ridders is gevallen! msg.vault_taken = Riddergewelf ingenomen: schatten ter waarde van {0} zijn van jou. 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! job.tear_bridge = Breekt een brug af job.patrol = Op patrouille job.guard = Op wacht diff --git a/lang/no.lang b/lang/no.lang index f61ef1b..9472ffe 100644 --- a/lang/no.lang +++ b/lang/no.lang @@ -313,6 +313,7 @@ hint.tower_max = Dette tårnet er fullt oppgradert. hint.tower_where = Tårn kan bare bygges på inntatte, tomme gulvruter. hint.tower_mana = Magitårnene dine har gått tom for mana. job.repair = Reparerer et tårn +job.mend_bridge = Reparerer en bro job.attack_tower = Angriper et tårn unit.jailer = Fangevokter @@ -399,6 +400,7 @@ 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. 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. hint.bridge_river = Broer kan bare bygges over vann eller lava. msg.hero_burned = En {0} falt i lavaen! +{1} gull. msg.creature_burned = Din {0} falt i lavaen. @@ -429,6 +431,7 @@ msg.enemy_tower_destroyed = Et av riddernes tårn har falt: {0}! 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! job.tear_bridge = River ned en bro job.patrol = På patrulje job.guard = På vakt diff --git a/lang/pt.lang b/lang/pt.lang index 5db87b1..60ff806 100644 --- a/lang/pt.lang +++ b/lang/pt.lang @@ -313,6 +313,7 @@ hint.tower_max = Esta torre já está totalmente melhorada. hint.tower_where = Só se podem construir torres em casas de chão reclamadas e vazias. hint.tower_mana = As tuas torres mágicas ficaram sem mana. job.repair = A reparar uma torre +job.mend_bridge = Repara uma ponte job.attack_tower = A atacar uma torre unit.jailer = Carcereiro @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Só se podem construir pontes sobre água ou lava. msg.hero_burned = Um {0} caiu na lava! +{1} de ouro. msg.creature_burned = O teu {0} caiu na lava. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Uma {0} dos cavaleiros caiu! 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! job.tear_bridge = A destruir uma ponte job.patrol = De patrulha job.guard = De guarda diff --git a/lang/ro.lang b/lang/ro.lang index 198d376..5e9346f 100644 --- a/lang/ro.lang +++ b/lang/ro.lang @@ -313,6 +313,7 @@ hint.tower_max = Acest turn e complet îmbunătățit. hint.tower_where = Turnurile se pot construi doar pe dale de podea cucerite și goale. hint.tower_mana = Turnurile tale magice au rămas fără mana. job.repair = Repară un turn +job.mend_bridge = Repară un pod job.attack_tower = Atacă un turn unit.jailer = Temnicer @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Podurile se pot construi doar peste apă sau lavă. msg.hero_burned = Un {0} a căzut în lavă! +{1} aur. msg.creature_burned = {0} al tău a căzut în lavă. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Un {0} al cavalerilor a căzut! msg.vault_taken = Seif al cavalerilor cucerit: o comoară în valoare de {0} e a ta. 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! job.tear_bridge = Dărâmă un pod job.patrol = În patrulă job.guard = De pază diff --git a/lang/ru.lang b/lang/ru.lang index 7785901..bfbe908 100644 --- a/lang/ru.lang +++ b/lang/ru.lang @@ -313,6 +313,7 @@ hint.tower_max = Эта башня улучшена до предела. hint.tower_where = Башни строятся только на захваченном пустом полу. hint.tower_mana = У магических башен кончилась мана. job.repair = Чинит башню +job.mend_bridge = Чинит мост job.attack_tower = Атакует башню unit.jailer = Тюремщик @@ -400,6 +401,7 @@ tool.bridge.name = Построить мост tool.bridge.desc = Строит мост через воду или лаву. Тяни от своей земли через реку; мост растёт клетка за клеткой от твоей территории. cost.bridge = {0} золота/клетка над водой, {1} над лавой hint.bridge_where = Мост должен начинаться у твоей земли: тяни от своей территории через реку. +hint.bridge_fire = Деревянные мосты горят: держите огненные ловушки, огненное дыхание и молнии подальше; каменные мосты над лавой не горят. hint.bridge_river = Мосты строятся только над водой или лавой. msg.hero_burned = Герой упал в лаву: {0}! +{1} золота. msg.creature_burned = Твой боец упал в лаву: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Рыцарская постройка пала: {0}! msg.vault_taken = Рыцарское хранилище взято: сокровища на {0} твои. msg.shard_taken = Осколок твоего ядра души снова в твоих руках! msg.bridge_torn = Рыцари разрушили один из твоих мостов! +msg.bridge_fire = Один из ваших мостов горит! job.tear_bridge = Ломает мост job.patrol = В дозоре job.guard = На страже diff --git a/lang/sk.lang b/lang/sk.lang index 8ab10c5..b082ad0 100644 --- a/lang/sk.lang +++ b/lang/sk.lang @@ -313,6 +313,7 @@ hint.tower_max = Táto veža je naplno vylepšená. hint.tower_where = Veže sa dajú stavať len na zabratých prázdnych políčkach podlahy. hint.tower_mana = Tvojim magickým vežiam došla mana. job.repair = Opravuje vežu +job.mend_bridge = Opravuje most job.attack_tower = Útočí na vežu unit.jailer = Žalárnik @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Mosty sa dajú stavať len cez vodu alebo lávu. msg.hero_burned = Do lávy spadol hrdina: {0}! +{1} zlata. msg.creature_burned = Do lávy spadol tvoj tvor: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Rytierska stavba padla: {0}! 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í! job.tear_bridge = Strháva most job.patrol = Na hliadke job.guard = Na stráži diff --git a/lang/sr.lang b/lang/sr.lang index 447082f..f41ea87 100644 --- a/lang/sr.lang +++ b/lang/sr.lang @@ -313,6 +313,7 @@ hint.tower_max = Ова кула је потпуно надограђена. hint.tower_where = Куле се граде само на освојеним, празним пољима пода. hint.tower_mana = Твојим магијским кулама је понестало мане. job.repair = Поправља кулу +job.mend_bridge = Поправља мост job.attack_tower = Напада кулу unit.jailer = Тамничар @@ -400,6 +401,7 @@ tool.bridge.name = Градња моста tool.bridge.desc = Гради мост преко воде или лаве. Превуци са свог тла преко реке; мост расте поље по поље од твоје територије. cost.bridge = {0} злата/поље преко воде, {1} преко лаве hint.bridge_where = Мостови морају да почну на твом тлу: превуци са своје територије преко реке. +hint.bridge_fire = Дрвени мостови горе: држи ватрене замке, ватрени дах и муње подаље – камени мостови над лавом не горе. hint.bridge_river = Мостови се граде само преко воде или лаве. msg.hero_burned = Пао је у лаву: {0}! +{1} злата. msg.creature_burned = Твоје створење је пало у лаву: {0}. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Пала је витешка кула: {0}! msg.vault_taken = Витешки трезор освојен: благо вредно {0} је твоје. msg.shard_taken = Крхотина твог језгра душе поново је у твојим рукама! msg.bridge_torn = Витезови су срушили један од твојих мостова! +msg.bridge_fire = Један од твојих мостова гори! job.tear_bridge = Руши мост job.patrol = У патроли job.guard = На стражи diff --git a/lang/sv.lang b/lang/sv.lang index d88faa8..e6b4b16 100644 --- a/lang/sv.lang +++ b/lang/sv.lang @@ -313,6 +313,7 @@ hint.tower_max = Det här tornet är fullt uppgraderat. hint.tower_where = Torn kan bara byggas på erövrade, tomma golvrutor. hint.tower_mana = Dina magitorn har slut på mana. job.repair = Reparerar ett torn +job.mend_bridge = Lagar en bro job.attack_tower = Anfaller ett torn unit.jailer = Fångvaktare @@ -400,6 +401,7 @@ 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. 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. hint.bridge_river = Broar kan bara byggas över vatten eller lava. msg.hero_burned = En {0} föll i lavan! +{1} guld. msg.creature_burned = Din {0} föll i lavan. @@ -430,6 +432,7 @@ msg.enemy_tower_destroyed = Ett {0} tillhörande riddarna har fallit! 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! job.tear_bridge = River en bro job.patrol = På patrull job.guard = På vakt diff --git a/src/bridges.rs b/src/bridges.rs new file mode 100644 index 0000000..6ff6710 --- /dev/null +++ b/src/bridges.rs @@ -0,0 +1,248 @@ +// 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. + +use crate::game::*; +use crate::map::*; +use crate::particles::*; +use serde::{Deserialize, Serialize}; + +// seconds a burning plank holds before it falls into the river +pub const BURN_TIME: f32 = 6.0; +// a burning plank sets a neighbouring wooden plank alight with this chance per second +pub const BURN_SPREAD: f32 = 0.35; +// fire damage per second to whoever stands on a burning plank +pub const BURN_DPS: f32 = 6.0; +// wear a knight does to a bridge tile per second (1.0 = it falls) +pub const TEAR_RATE: f32 = 0.12; +// wear an imp mends per second +pub const MEND_RATE: f32 = 0.25; + +#[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 +} + +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) + } + + pub fn burning(&self, i: usize) -> bool { + self.bridgework.burning.iter().any(|b| b.0 == i) + } + + pub fn wear_of(&self, i: usize) -> f32 { + self.bridgework.wear.iter().find(|w| w.0 == i).map_or(0.0, |w| w.1) + } + + // fire reaches tile (x, y): a wooden bridge there starts to burn + pub fn ignite_at(&mut self, x: f32, y: f32) { + let (tx, ty) = (x.floor() as i32, y.floor() as i32); + if !inb(tx, ty) { + return; + } + let i = idx(tx, ty); + if !self.wooden_bridge(i) || self.burning(i) { + return; + } + self.bridgework.burning.push((i, 0.0)); + self.fx(3, tx as f32 + 0.5, ty as f32 + 0.5, 0.0, 0.0, 0.5, 0xff2080ff); + if self.map.t[i].owner == self.me { + self.msg("msg.bridge_fire", vec![]); + self.hint(32, "hint.bridge_fire"); + } + } + + // fire along a jet from (x, y) in direction (dx, dy) over `len` tiles + pub fn ignite_line(&mut self, x: f32, y: f32, dx: f32, dy: f32, len: f32) { + let steps = (len * 3.0) as usize; + for s in 1..=steps { + let f = s as f32 / 3.0; + self.ignite_at(x + dx * f, y + dy * f); + } + } + + // the shared part of every step: fire, collapse + pub(crate) fn update_bridges(&mut self, dt: f32) { + if self.bridgework.burning.is_empty() { + return; + } + let mut k = 0; + while k < self.bridgework.burning.len() { + let (i, t0) = self.bridgework.burning[k]; + // the plank is gone already (torn down, sold, rebuilt) + if !self.wooden_bridge(i) { + self.bridgework.burning.swap_remove(k); + continue; + } + let t = t0 + dt; + self.bridgework.burning[k].1 = t; + let (x, y) = xy(i); + let (fx, fy) = (x as f32 + 0.5, y as f32 + 0.5); + // flames and smoke (looks only) + if self.vrng.f() < dt * 14.0 { + let (ox, oy) = (self.vrng.f() - 0.5, self.vrng.f() - 0.5); + let v = (self.vrng.f() * 0.4 - 0.2, self.vrng.f() * 0.4 - 0.2, 0.9 + self.vrng.f() * 0.8); + self.parts.push(Part { kind: EMBER, x: fx + ox * 0.9, y: fy + oy * 0.9, h: 0.15, vx: v.0, vy: v.1, vh: v.2, t: 0.0, max: 0.7, col: abgr(255, 120 + (self.vrng.f() * 80.0) as u8, 30), size: 0.08 }); + } + if self.vrng.f() < dt * 3.0 { + self.parts.push(Part { kind: SMOKE, x: fx + self.vrng.f() - 0.5, y: fy + self.vrng.f() - 0.5, h: 0.5, vx: 0.0, vy: 0.0, vh: 0.6, t: 0.0, max: 2.2, col: abgr(40, 34, 30), size: 0.18 }); + } + // whoever stands in the flames gets burnt + for j in 0..self.ents.len() { + let e = &self.ents[j]; + if e.alive && !e.held && !flies(e.kind) && e.tile() == i { + self.ents[j].hp -= BURN_DPS * dt; + if self.ents[j].hp <= 0.0 { + self.kill(j); + } + } + } + // the fire spreads along the planks (deterministic: the shared random numbers) + if t > 1.5 && (t / 1.0).floor() != ((t - dt) / 1.0).floor() { + for &(dx, dy) in DIR4.iter() { + if !inb(x + dx, y + dy) { + continue; + } + let n = idx(x + dx, y + dy); + if self.wooden_bridge(n) && !self.burning(n) && self.rng.f() < BURN_SPREAD { + self.bridgework.burning.push((n, 0.0)); + } + } + } + if t >= BURN_TIME { + self.bridgework.burning.swap_remove(k); + self.bridge_falls(i); + continue; + } + k += 1; + } + } + + // a bridge tile falls into its river: whoever stands there goes into the water (or lava) + pub(crate) fn bridge_falls(&mut self, i: usize) { + let t = self.map.t[i]; + if !t.bridge() { + return; + } + let mine = t.owner == self.me; + let tl = &mut self.map.t[i]; + tl.kind = if t.river() == Some(Kind::Lava) { Kind::Lava } else { Kind::Water }; + tl.owner = Owner::None; + tl.reserved = 0; + tl.res = 0; + self.bridgework.wear.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); + for _ in 0..6 { + let v = (self.vrng.f() * 2.0 - 1.0, self.vrng.f() * 2.0 - 1.0, 0.6 + self.vrng.f()); + self.parts.push(Part { kind: DEBRIS, x: x as f32 + 0.5, y: y as f32 + 0.5, h: 0.2, vx: v.0, vy: v.1, vh: v.2, t: 0.0, max: 1.2, col: abgr(90, 62, 34), size: 0.08 }); + } + self.sfx(Sfx::DigDone, x as f32 + 0.5, y as f32 + 0.5); + if mine { + self.msg("msg.bridge_torn", vec![]); + } + } + + // a knight works on a bridge tile: true while it still stands + pub(crate) fn wear_bridge(&mut self, i: usize, dt: f32) -> bool { + let w = self.wear_of(i) + TEAR_RATE * dt; + if w >= 1.0 { + self.bridge_falls(i); + return false; + } + match self.bridgework.wear.iter_mut().find(|x| x.0 == i) { + Some(x) => x.1 = w, + None => self.bridgework.wear.push((i, w)), + } + true + } + + // an imp mends a worn bridge tile: true while there is more to do + pub(crate) fn mend_bridge(&mut self, i: usize, dt: f32) -> bool { + let Some(k) = self.bridgework.wear.iter().position(|x| x.0 == i) else { return false }; + self.bridgework.wear[k].1 -= MEND_RATE * dt; + if self.bridgework.wear[k].1 <= 0.0 { + self.bridgework.wear.swap_remove(k); + return false; + } + true + } + + // a worn (not burning) bridge tile of the master being processed next to or at tile i + pub(crate) fn worn_bridge_near(&self, i: usize) -> Option { + if self.bridgework.wear.is_empty() { + return None; + } + let (x, y) = xy(i); + std::iter::once((0, 0)).chain(DIR4.iter().copied()).find_map(|(dx, dy)| { + let n = idx(x + dx, y + dy); + let ok = inb(x + dx, y + dy) && self.map.t[n].bridge() && self.map.t[n].owner == self.me && self.wear_of(n) > 0.0 && !self.burning(n); + ok.then_some(n) + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // a wooden bridge of the player across a strip of water, 6 tiles long + fn bridge_game() -> (Game, Vec) { + let mut g = Game::new(5, 64, 64); + let (cx, cy) = g.map.core; + let y = cy + 6; + let mut tiles = Vec::new(); + for x in cx - 3..cx + 3 { + let i = idx(x, y); + g.map.t[i].kind = Kind::Bridge; + g.map.t[i].owner = Owner::Player; + for dy in [-1, 1] { + let t = &mut g.map.t[idx(x, y + dy)]; + t.kind = Kind::Water; + t.owner = Owner::None; + } + tiles.push(i); + } + (g, tiles) + } + + #[test] + fn a_burning_bridge_spreads_and_falls() { + let (mut g, tiles) = bridge_game(); + let (x, y) = xy(tiles[2]); + g.ignite_at(x as f32 + 0.5, y as f32 + 0.5); + assert!(g.burning(tiles[2])); + for _ in 0..(20 * 20) { + g.update(0.05); + } + assert_eq!(g.map.t[tiles[2]].kind, Kind::Water, "the burnt plank fell"); + assert!(tiles.iter().filter(|&&i| g.map.t[i].kind == Kind::Water).count() >= 2, "the fire spread"); + assert!(g.bridgework.burning.iter().all(|b| g.wooden_bridge(b.0))); + } + + #[test] + fn stone_bridges_do_not_burn() { + let (mut g, tiles) = bridge_game(); + g.map.t[tiles[0]].kind = Kind::LavaBridge; + let (x, y) = xy(tiles[0]); + g.ignite_at(x as f32 + 0.5, y as f32 + 0.5); + assert!(!g.burning(tiles[0])); + } + + #[test] + fn worn_bridges_fall_or_are_mended() { + let (mut g, tiles) = bridge_game(); + assert!(g.wear_bridge(tiles[1], 2.0)); + assert!(g.wear_of(tiles[1]) > 0.2); + assert_eq!(g.worn_bridge_near(tiles[1]), Some(tiles[1])); + while g.mend_bridge(tiles[1], 0.5) {} + assert_eq!(g.wear_of(tiles[1]), 0.0); + while g.wear_bridge(tiles[1], 1.0) {} + assert_eq!(g.map.t[tiles[1]].kind, Kind::Water); + } +} diff --git a/src/game.rs b/src/game.rs index 4994f60..fd606d0 100644 --- a/src/game.rs +++ b/src/game.rs @@ -207,6 +207,7 @@ pub enum Job { Brawl(u32), // two creatures that cannot stand each other scuffle (never to the death) Guard(usize), // holds a guard post Spar(usize), // sparring in the arena + MendBridge(usize), // imp mends a worn bridge tile } #[derive(Clone, Serialize, Deserialize)] @@ -583,6 +584,8 @@ pub struct Game { #[serde(default)] pub dwarf_caves: Vec, #[serde(default)] + pub bridgework: crate::bridges::BridgeWork, // burning and worn bridges + #[serde(default)] pub dwarf_t: f32, #[serde(default)] pub rune_free: u32, // rune forge towers that can be built for free (from chests) @@ -627,7 +630,7 @@ pub struct Game { #[serde(skip)] pub debug_markers: bool, // show debug-only command markers #[serde(skip, default = "hint_times")] - hint_t: [f32; 32], // last time each hint slot was shown + hint_t: [f32; 48], // last time each hint slot was shown } pub const MARK_DIG: u8 = 0; @@ -660,8 +663,8 @@ pub struct Mark { pub fixed: bool, // guard/attack/gather order flags are shown without the debug setting } -fn hint_times() -> [f32; 32] { - [-1000.0; 32] +fn hint_times() -> [f32; 48] { + [-1000.0; 48] } // every simulation step has the same length: on every client of a match the same commands are @@ -898,6 +901,7 @@ impl Game { stuck: Vec::new(), vrng: crate::particles::vrng(), dwarf_caves: Vec::new(), + bridgework: Default::default(), dwarf_t: 30.0, rune_free: 0, rune_final: 0, @@ -1650,6 +1654,7 @@ impl Game { self.update_rivals(dt); } self.update_dwarves(dt); + self.update_bridges(dt); // fallen hearts of a match are shared state: every client marks them in the same step self.update_fallen_masters(); // the end of the game and the fog are about the master at this computer @@ -2339,7 +2344,7 @@ impl Game { Some((x as f32 + 0.5, y as f32 + 0.5)) }; let target = match e.job { - Job::Dig(t) | Job::Reinforce(t) | Job::Help(t) | Job::TearBridge(t) => tile(t), + Job::Dig(t) | Job::Reinforce(t) | Job::Help(t) | Job::TearBridge(t) | Job::MendBridge(t) => tile(t), Job::Attack(id) | Job::Torment(id) | Job::Carry(id) | Job::Brawl(id) => self.find(id).map(|j| (self.ents[j].x, self.ents[j].y)), Job::Repair(id) | Job::AttackTower(id) => self.towers.iter().find(|t| t.id == id).map(|t| t.pos()), _ => None, @@ -2625,6 +2630,10 @@ impl Game { } } if e.kind == EK::Priestess || e.kind == EK::Wyrm || e.kind == EK::BattleMage { + // fire on a wooden bridge sets it alight now and then + if self.rng.f() < 0.25 { + self.ignite_at(tx, ty); + } // fireball / fire breath: half damage to enemies around the target let me = e.side(); let splash: Vec = self @@ -3074,21 +3083,14 @@ impl Game { e.path.clear(); e.working = true; e.face = sgn(bx as f32 + 0.5 - e.x); + // the bridge wears down step by step; imps can mend it while it stands e.timer += dt; - if e.timer >= 4.0 { - e.timer = 0.0; - let lava = t.kind == Kind::LavaBridge; - let tl = &mut self.map.t[i]; - tl.kind = if lava { Kind::Lava } else { Kind::Water }; - tl.owner = Owner::None; - tl.reserved = 0; - self.ground_lost(i); - self.fx(6, bx as f32 + 0.5, by as f32 + 0.5, 0.0, 0.0, 0.6, 0xff3a5a7a); - self.sfx(Sfx::DigDone, bx as f32 + 0.5, by as f32 + 0.5); - self.msg("msg.bridge_torn", vec![]); - return false; + if e.timer >= 1.0 { + e.timer -= 1.0; + self.sfx(Sfx::MeleeHit, bx as f32 + 0.5, by as f32 + 0.5); + self.fx(2, bx as f32 + 0.5, by as f32 + 0.5, 0.0, 0.0, 0.2, 0xff3a5a7a); } - return true; + return self.wear_bridge(i, dt); } if e.path.is_empty() && e.repath <= 0.0 { e.repath = 1.5; @@ -3322,6 +3324,22 @@ impl Game { self.sfx(Sfx::Reinforce, tx, ty); } } + Job::MendBridge(b) => { + let (bx, by) = xy(b); + let (tx, ty) = (bx as f32 + 0.5, by as f32 + 0.5); + if (tx - e.x).abs() > 1.6 || (ty - e.y).abs() > 1.6 || self.burning(b) { + e.job = Job::None; + return; + } + e.face = sgn(tx - e.x); + e.working = true; + if !self.mend_bridge(b, dt) { + e.job = Job::None; + } + if (e.anim * 3.0).fract() < dt * 3.0 { + self.sfx(Sfx::Reinforce, tx, ty); + } + } Job::Help(t) => { // the task is done or nobody works on it any more: back to thinking if self.task_worker(t).is_none() || self.helpers(t) > HELPERS_MAX { @@ -3488,6 +3506,15 @@ impl Game { return; } } + // ... and so are bridges the knights worked on + if let Some(p) = self.map.search(cur, self.map.walk_cost(), |i| self.worn_bridge_near(i).is_some(), true) { + let end = p.last().copied().unwrap_or(cur); + if let Some(b) = self.worn_bridge_near(end) { + e.path = p; + e.job = Job::MendBridge(b); + return; + } + } if let Some(p) = self.map.search(cur, self.map.walk_cost(), |i| self.claimable(i, me), true) { let end = p.last().copied().unwrap_or(cur); self.map.t[end].reserved = me; @@ -5368,6 +5395,7 @@ impl Game { self.mana -= COST; self.sfx(Sfx::Lightning, wx, wy); self.fx(1, wx, wy, 0.0, 0.0, 0.5, 0xffffeeaa); + self.ignite_at(wx, wy); let mut kills = Vec::new(); for (j, e) in self.ents.iter_mut().enumerate() { if e.alive && !e.held && e.active_hero() && (e.x - wx).powi(2) + (e.y - wy).powi(2) < 2.6 { @@ -5551,6 +5579,7 @@ pub fn job_name(e: &Ent) -> &'static str { Job::Leave => "job.leave", Job::Reinforce(_) => "job.reinforce", Job::Repair(_) => "job.repair", + Job::MendBridge(_) => "job.mend_bridge", Job::Carry(_) => "job.carry", Job::Pray(_) => "job.pray", Job::HealCore => "job.heal_core", diff --git a/src/main.rs b/src/main.rs index ce1011d..91c3166 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,7 @@ mod save; #[cfg(test)] mod scenes; mod blocks; +mod bridges; mod mscript; mod settings; mod sfx; diff --git a/src/render3d.rs b/src/render3d.rs index 92710d6..f6a8883 100644 --- a/src/render3d.rs +++ b/src/render3d.rs @@ -1138,6 +1138,12 @@ impl R3d { } } } + // burning bridges flicker + for &(i, _) in g.bridgework.burning.iter().filter(|b| g.map.shown(b.0)) { + let (x, z) = xy(i); + let fl = 0.8 + 0.2 * (t * 11.0 + i as f32).sin(); + push(vec3(x as f32 + 0.5, 0.6, z as f32 + 0.5), 4.5, vec3(1.0, 0.5, 0.15), 1.6 * fl, 5.0); + } let pulse = 0.5 + 0.5 * (t * 4.0).sin(); for &(ex, ey) in &g.planned_entries { push(vec3(ex as f32 + 0.5, 1.2, ey as f32 + 0.5), 5.0, vec3(1.0, 0.12, 0.08), 0.6 + 1.0 * pulse, 30.0); diff --git a/src/traps.rs b/src/traps.rs index 2b0dce2..7cc6b48 100644 --- a/src/traps.rs +++ b/src/traps.rs @@ -529,6 +529,7 @@ impl Game { self.traps[k].sprung = true; self.traps[k].aim = a; let (dx, dy) = (a.cos(), a.sin()); + self.ignite_line(cx, cy, dx, dy, 3.2); for o in near(3.4, &self.ents) { let (rx, ry) = (self.ents[o].x - cx, self.ents[o].y - cy); let along = rx * dx + ry * dy;