diff --git a/README.md b/README.md index 88c6128..1090802 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ to *step through shadows*, the chainbreaker to spin like a *whirlwind*. frost glows - and doors of wood, iron and magic. Lock them, and nobody gets through. Not even the giant. Well. Not for a while. **✨ Cast nasty spells.** Lightning, healing, seer's eye, cave-in, haste, stoneskin, gold rain, invisibility, -plague and quake. Your scholars **research** them in the library - one discovery after another. +plague, quake and frost. Your scholars **research** them in the library - one discovery after another. **🌫 Explore the dark.** Everything beyond your walls is black until your creatures go there. Somewhere out there: a cave of neutral **dwarves** guarding gold and gems - and sometimes a chest with the plans @@ -84,6 +84,18 @@ of a dwarven **rune forge tower**. Islands in lava rivers. Mana springs. Creatur
Left: the forge and its little coglings. Right: prison, graveyard, arena, guard posts and the altar. Cosy.

+**🌳 Up into the daylight.** Some maps reach the surface: grass, birds, sunshine - disgusting - and forests your +imps fell for **wood**, the second resource (down below only the odd giant mushroom gives some). Wood builds bridges +and wooden doors. Raise walls again where you dug too much, burn the knights' wooden bridges, pull up your +**drawbridges** when they come, freeze lava into obsidian to cross it - and roll **battering rams and catapults** out +of your forge to break a fortress in the forest. + +

+ The cliff between the dungeon and a sunny forest above ground + A raised drawbridge, a lowered one, and obsidian on a lava river +
Left: the world up there. Too bright. Right: a drawbridge up, a drawbridge down, and lava that thinks it is a floor. +

+ **👑 Other masters want your realm, too.** Mossgrim the Mouldy (green, smells like a wet cellar) and Lady Nightwell (blue, writes threatening letters on scented paper) dig their own dungeons in free play and in the campaign. And the humans attack *everybody*. Let them bite each other first. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 4c33449..c07362d 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -30,7 +30,7 @@ Stone bridges over lava exist already (75 gold per tile). 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 +## 3. The surface world – done (v202611-00038) 1. **Surface terrain** – grass, trees, paths, daylight and sky. Trees act like earth: imps fell them. @@ -48,6 +48,18 @@ automatic) and the *Frost* spell (lava → obsidian for 40 s); the frost glow tr with the High Marshal's fortress to destroy. Free play and multiplayer get a map option "Surface". The map editor gets the new terrain. +Built as: `src/wood.rs` (wood, giant mushrooms), `src/walls.rs` (the wall tool), `src/surface.rs` (sky layer +`Map::sky`, forests, cliffs and cave mouths, clearings around fortresses), `src/siege.rs` (rams and catapults: +in hero waves from wave 4/6, buildable with a forge). The fortresses above ground are the knights' usual +fortresses (fortress.rs) in a clearing. Final missions: campaign M30 and co-op M20; free play, versus matches +and editor random maps have the option "half above ground". + +## 3b. Music (next milestone) + +Six more underground tracks and a block of six surface tracks: the same leitmotif brighter and in major, synthetic +birdsong and wind, flute leads and harp arpeggios. The music follows the camera (surface or underground) with a +crossfade. + ## 4. Additions 1. **Random events** – earthquake (tunnels cave in), lava eruption, flood, gold vein found. Rare diff --git a/docs/screenshots/bridges.png b/docs/screenshots/bridges.png new file mode 100644 index 0000000..2978549 Binary files /dev/null and b/docs/screenshots/bridges.png differ diff --git a/docs/screenshots/surface.png b/docs/screenshots/surface.png new file mode 100644 index 0000000..fa011ee Binary files /dev/null and b/docs/screenshots/surface.png differ diff --git a/lang/cs.lang b/lang/cs.lang index e5d2ca8..84c795e 100644 --- a/lang/cs.lang +++ b/lang/cs.lang @@ -572,7 +572,7 @@ camp.m29.story = Lávové ostrovy, pane, s prameny many vroucími uprostřed, a camp.m20.title = Velmistr camp.m20.story = Velmistr Valerián Jasnoštít čeká ve své citadele za velkou řekou, s posledním střepem a branou řádu. Sto let se modlil, leštil a připravoval. | Znič jeho bránu a vezmi si střep zpět. Pak bude tvé jádro celé - a každý mistr, který ho kdy chtěl, si pro něj přijde naráz. Pěkně jedno po druhém. camp.m30.title = Trůn hlubin -camp.m30.story = Stalo se, jak jsem říkal: tvé jádro je celé a teď ho chce každý. Mossgrim a Lady Nightwell táhnou spolu a co zbylo z Řádu, otevírá svou bránu naposledy. | Znič obě jádra mistrů i bránu řádu. Pak budou mít hlubiny přesně jednoho pána. Hádej koho. Nápověda: mě ne, já jsem tu přes čaj. +camp.m30.story = Stalo se, jak jsem říkal: tvé jádro je celé a teď ho chce každý. Mossgrim a lady Nightwell se prokopali na povrch a vrchní maršál čeká ve své pevnosti v lese – denní světlo, ptáci, celý balík. Odporné. | Vylez ze skály, znič obě jádra pánů a bránu řádu v pevnosti. Pak bude mít svět přesně jednoho pána. Hádej koho. Tip: ne mě, já jsem čajový. camp.epilogue = Zelené jádro se rozpadá, modré pohasíná a brána řádu utichá. Kdesi nahoře píše Světlá stráž velmi dlouhé hlášení a dopisy Lady Nightwell přestaly chodit. | Křivoprst uvařil čaj. Jsi celý, pane. Podsvětí je tvé. lair.arrivals = Volná lůžka: {0}, noví tvorové přicházejí rychlostí {1} % job.help = Pomáhá @@ -1540,7 +1540,7 @@ coop.m19.boss = Vrchní maršál padl! Jeho zbroj řinčí jako upuštěný šup coop.m19.t1 = Čeká na východě. Ať čeká. Nejdřív vyčistěte stráže. coop.m19.t2 = Zase rytíři a lučištnice. Řádu docházejí nápady. coop.m20.title = Mossgrimův pád -coop.m20.story = Když je vrchní maršál pryč, Mossgrim zůstal sám. Vzal na sebe podobu žhavého draka a shromáždil každého tvora, který ho ještě poslouchá.\n\nSkoncujte se zrádcem. Skoncujte s jeho armádou. A pak, páni - čaj. +coop.m20.story = Bez vrchního maršála je Mossgrim sám – nahoře v lese, na slunci, zrovna tam. Přijal podobu žhavého draka a shromáždil každou bytost, která ho ještě poslouchá.\n\nVylezte ze skály a skoncujte se zrádcem. S jeho armádou. A pak, páni – čaj. coop.m20.start = Mossgrime, ty stará houbo. Liga tě pozdravuje. coop.m20.goal = Porazte Mossgrima a všechny jeho tvory. coop.m20.boss = Mossgrim už není. Mech zase doroste. On ne. diff --git a/lang/da.lang b/lang/da.lang index 6eee631..a036f96 100644 --- a/lang/da.lang +++ b/lang/da.lang @@ -571,7 +571,7 @@ camp.m29.story = Lavaøer, mester, med manakilder, der koger i midten, og en for camp.m20.title = Stormesteren camp.m20.story = Stormester Valerian Lysskjold venter i sit citadel hinsides den store flod, med den sidste splint og ordenens port. Han har bedt, pudset og forberedt sig i hundrede år. | Ødelæg hans port og tag splinten tilbage. Så er din kerne hel - og hver eneste mester, der nogensinde har villet have den, kommer efter den på én gang. Én ting ad gangen. camp.m30.title = Dybets trone -camp.m30.story = Det gik, som jeg sagde: din kerne er hel, og nu vil alle have den. Mossgrim og Lady Nightwell marcherer sammen, og det, der er tilbage af Ordenen, åbner sin port en sidste gang. | Ødelæg begge mesterkerner og ordenens port. Derefter har dybet præcis én mester. Gæt hvem. Et tip: ikke mig, jeg er ham med teen. +camp.m30.story = Det gik, som jeg sagde: din kerne er hel, og nu vil alle have den. Mossgrim og Lady Nightwell har gravet sig op til overfladen, og højmarskallen venter i sin fæstning i skoven – dagslys, fugle, hele pakken. Ulækkert. | Kravl ud af klippen, ødelæg begge mesterkerner og ordenens port inde i fæstningen. Derefter har verden præcis én mester. Gæt hvem. Tip: ikke mig, jeg er temanden. camp.epilogue = Den grønne kerne smuldrer, den blå bliver mørk, og ordenens port forstummer. Et sted deroppe skriver Lysvagten en meget lang rapport, og Lady Nightwells breve er holdt op med at komme. | Krumfinger har lavet te. Du er hel, mester. Underverdenen er din. lair.arrivals = {0} ledige senge: nye væsner ankommer med {1}% hastighed job.help = Hjælper @@ -1539,7 +1539,7 @@ coop.m19.boss = Højmarskallen er faldet! Hans rustning klirrer som en tabt best coop.m19.t1 = Han venter i øst. Lad ham vente. Ryd vagterne først. coop.m19.t2 = Riddere og bueskytter igen. Ordenen er ved at løbe tør for ideer. coop.m20.title = Mossgrims fald -coop.m20.story = Med højmarskallen væk står Mossgrim alene. Han har taget skikkelse af en glødelindorm og samlet hvert eneste væsen, der stadig lytter til ham.\n\nGør det af med forræderen. Gør det af med hans hær. Og så, mestre - te. +coop.m20.story = Uden højmarskallen står Mossgrim alene – oppe i skoven, i solen, af alle steder. Han har taget skikkelse af en gløddrage og samlet alle væsner, der stadig lytter til ham.\n\nKravl ud af klippen og gør det af med forræderen. Med hans hær. Og så, mestre – te. coop.m20.start = Mossgrim, din gamle svamp. Forbundet sender sine hilsner. coop.m20.goal = Besejr Mossgrim og alle hans væsner. coop.m20.boss = Mossgrim er ikke mere. Mosset gror ud igen. Det gør han ikke. diff --git a/lang/de.lang b/lang/de.lang index d36f59e..222af33 100644 --- a/lang/de.lang +++ b/lang/de.lang @@ -571,7 +571,7 @@ camp.m29.story = Lavainseln, Meister, mit kochenden Manaquellen in der Mitte, un camp.m20.title = Der Großmeister camp.m20.story = Großmeister Valerian Hellschild erwartet dich in seiner Zitadelle jenseits des großen Flusses, mit dem letzten Splitter und dem Tor des Ordens. Hundert Jahre lang hat er gebetet, poliert und sich vorbereitet. | Zerstöre sein Tor und hol dir den Splitter. Dann ist dein Kern ganz - und jeder Meister, der ihn je haben wollte, wird auf einmal danach greifen. Eins nach dem anderen. camp.m30.title = Der Thron der Tiefe -camp.m30.story = Es kam, wie ich gesagt habe: Dein Kern ist ganz, und jetzt wollen ihn alle. Mossgrim und Lady Nightwell marschieren gemeinsam, und was vom Orden übrig ist, öffnet ein letztes Mal sein Tor. | Zerstöre beide Meisterkerne und das Tor des Ordens. Danach hat die Tiefe genau einen Meister. Rate, wen. Kleiner Tipp: nicht mich, ich bin der Teemann. +camp.m30.story = Es kam, wie ich sagte: Dein Kern ist ganz, und jetzt will ihn jeder. Mossgrim und Lady Nightwell haben sich bis an die Oberfläche gegraben, und der Hochmarschall wartet in seiner Festung im Wald – Tageslicht, Vögel, das volle Programm. Widerlich. | Steig aus dem Fels, zerstöre beide Meisterkerne und das Tor des Ordens in der Festung. Danach hat die Welt genau einen Meister. Rate mal, wen. Tipp: nicht mich, ich bin der Teemann. camp.epilogue = Der grüne Kern zerbröselt, der blaue erlischt, und das Tor des Ordens verstummt. Irgendwo dort oben schreibt die Lichtwacht einen sehr langen Bericht, und Lady Nightwells Briefe bleiben aus. | Krummfinger hat Tee gekocht. Du bist wieder ganz, Meister. Das Unterreich gehört dir. lair.arrivals = {0} freie Plätze: Neue Kreaturen kommen mit {1}% Tempo job.help = Hilft mit @@ -1539,7 +1539,7 @@ coop.m19.boss = Der Hochmarschall ist gefallen! Seine Rüstung scheppert wie ein coop.m19.t1 = Er wartet im Osten. Lasst ihn warten. Erst die Garde. coop.m19.t2 = Wieder Ritter und Schützen. Dem Orden gehen die Ideen aus. coop.m20.title = Mossgrims Fall -coop.m20.story = Ohne den Hochmarschall steht Mossgrim allein. Er hat die Gestalt eines Glutwurms angenommen und jede Kreatur versammelt, die ihm noch gehorcht.\n\nBeendet den Verräter. Beendet seine Armee. Und dann, Meister - Tee. +coop.m20.story = Mit dem Hochmarschall ist Mossgrim allein – oben im Wald, in der Sonne, ausgerechnet. Er hat die Gestalt eines Glutwurms angenommen und jede Kreatur versammelt, die noch auf ihn hört.\n\nSteigt aus dem Fels und beendet den Verräter. Beendet sein Heer. Und dann, Meister – Tee. coop.m20.start = Mossgrim, du alter Pilz. Der Bund lässt grüßen. coop.m20.goal = Besiegt Mossgrim und alle seine Kreaturen. coop.m20.boss = Mossgrim ist nicht mehr. Das Moos wächst nach. Er nicht. diff --git a/lang/el.lang b/lang/el.lang index 80157e6..8d9df25 100644 --- a/lang/el.lang +++ b/lang/el.lang @@ -572,7 +572,7 @@ camp.m29.story = Νησιά λάβας, αφέντη, με πηγές μάνα camp.m20.title = Ο Μέγας Μάγιστρος camp.m20.story = Ο Μέγας Μάγιστρος Βαλέριαν Λαμπρασπίδας περιμένει στην ακρόπολή του πέρα από το μεγάλο ποτάμι, με το τελευταίο θραύσμα και την πύλη του τάγματος. Προσεύχεται, γυαλίζει και προετοιμάζεται εδώ κι εκατό χρόνια. | Κατάστρεψε την πύλη του και πάρε πίσω το θραύσμα. Τότε ο πυρήνας σου θα είναι ολόκληρος - και κάθε άρχοντας που τον ήθελε ποτέ θα έρθει να τον πάρει, όλοι μαζί. Ένα-ένα τα πράγματα. camp.m30.title = Ο Θρόνος των Βαθών -camp.m30.story = Έγινε όπως το είπα: ο πυρήνας σου είναι ολόκληρος, και τώρα τον θέλουν όλοι. Ο Μόσγκριμ και η Λαίδη Νάιτγουελ βαδίζουν μαζί, κι ό,τι απέμεινε από το Τάγμα ανοίγει την πύλη του μια τελευταία φορά. | Κατάστρεψε και τους δύο πυρήνες αρχόντων και την πύλη του τάγματος. Μετά από αυτό τα βάθη έχουν ακριβώς έναν άρχοντα. Μάντεψε ποιον. Υπόδειξη: όχι εμένα, εγώ φτιάχνω το τσάι. +camp.m30.story = Έγινε όπως είπα: ο πυρήνας σου είναι ακέραιος, και τώρα τον θέλουν όλοι. Ο Μόσγκριμ και η Λαίδη Νάιτγουελ έσκαψαν ως την επιφάνεια, κι ο Ύπατος Στρατάρχης περιμένει στο φρούριό του στο δάσος – φως της μέρας, πουλιά, όλο το πακέτο. Αηδία. | Βγες από τον βράχο, κατάστρεψε και τους δύο πυρήνες των αρχόντων και την πύλη του τάγματος μέσα στο φρούριο. Μετά ο κόσμος θα έχει ακριβώς έναν άρχοντα. Μάντεψε ποιον. Βοήθεια: όχι εμένα, εγώ φτιάχνω τσάι. camp.epilogue = Ο πράσινος πυρήνας θρυμματίζεται, ο γαλάζιος σβήνει, και η πύλη του τάγματος σωπαίνει. Κάπου εκεί πάνω η Φωτοφρουρά γράφει μια πολύ μακροσκελή αναφορά, και τα γράμματα της Λαίδης Νάιτγουελ έπαψαν να έρχονται. | Ο Στραβοδάχτυλος έφτιαξε τσάι. Είσαι ολόκληρος, αφέντη. Ο κάτω κόσμος είναι δικός σου. lair.arrivals = {0} ελεύθερα κρεβάτια: νέα πλάσματα φτάνουν με ταχύτητα {1}% job.help = Βοηθά @@ -1540,7 +1540,7 @@ coop.m19.boss = Ο Ύπατος Στρατάρχης έπεσε! Η πανοπλ coop.m19.t1 = Περιμένει στα ανατολικά. Ας περιμένει. Καθαρίστε πρώτα τους φρουρούς. coop.m19.t2 = Πάλι ιππότες και τοξότριες. Το Τάγμα ξεμένει από ιδέες. coop.m20.title = Η Πτώση του Μόσγκριμ -coop.m20.story = Με τον Ύπατο Στρατάρχη εκτός, ο Μόσγκριμ στέκεται μόνος. Πήρε τη μορφή ενός δράκου της θράκας και μάζεψε κάθε πλάσμα που ακόμη τον ακούει.\n\nΤελειώστε τον προδότη. Τελειώστε τον στρατό του. Και μετά, αφέντες - τσάι. +coop.m20.story = Χωρίς τον Ύπατο Στρατάρχη ο Μόσγκριμ είναι μόνος – πάνω στο δάσος, στον ήλιο, απ' όλα τα μέρη. Πήρε τη μορφή δράκου της θράκας και μάζεψε κάθε πλάσμα που ακόμα τον ακούει.\n\nΒγείτε από τον βράχο και τελειώστε τον προδότη. Τελειώστε τον στρατό του. Κι ύστερα, άρχοντες – τσάι. coop.m20.start = Μόσγκριμ, γέρικο μανιτάρι. Η συμμαχία σού στέλνει χαιρετίσματα. coop.m20.goal = Νικήστε τον Μόσγκριμ και όλα του τα πλάσματα. coop.m20.boss = Ο Μόσγκριμ δεν υπάρχει πια. Τα βρύα θα ξαναφυτρώσουν. Αυτός όχι. diff --git a/lang/en.lang b/lang/en.lang index 32e4f99..9f99b9a 100644 --- a/lang/en.lang +++ b/lang/en.lang @@ -572,7 +572,7 @@ camp.m29.story = Lava islands, master, with springs of mana boiling in the middl camp.m20.title = The Grand Master camp.m20.story = Grand Master Valerian Brightshield waits in his citadel beyond the great river, with the last shard and the gate of the order. He has prayed, polished and prepared for a hundred years. | Destroy his gate and take back the shard. Then your core is whole - and every master who ever wanted it will come for it at once. One thing at a time. camp.m30.title = The Throne of the Deep -camp.m30.story = It happened as I said: your core is whole, and now everybody wants it. Mossgrim and Lady Nightwell march together, and what is left of the Order opens its gate one last time. | Destroy both master cores and the gate of the order. After this the deep has exactly one master. Guess who. Hint: not me, I am the tea man. +camp.m30.story = It happened as I said: your core is whole, and now everybody wants it. Mossgrim and Lady Nightwell have dug their way up to the surface, and the High Marshal waits in his fortress in the forest – daylight, birds, the works. Disgusting. | Climb out of the rock, destroy both master cores and the gate of the order inside the fortress. After this the world has exactly one master. Guess who. Hint: not me, I am the tea man. camp.epilogue = The green core crumbles, the blue one goes dark, and the gate of the order falls silent. Somewhere above, the Lightwatch is writing a very long report, and Lady Nightwell's letters have stopped coming. | Crookfinger has made tea. You are whole, master. The underworld is yours. lair.arrivals = {0} free beds: new creatures arrive at {1}% speed job.help = Helping @@ -1540,7 +1540,7 @@ coop.m19.boss = The High Marshal has fallen! His armour clatters like a dropped coop.m19.t1 = He waits in the east. Let him wait. Clear the guards first. coop.m19.t2 = Knights and archers again. The Order is running out of ideas. coop.m20.title = Mossgrim's Fall -coop.m20.story = With the High Marshal gone, Mossgrim stands alone. He has taken the shape of an ember wyrm and gathered every creature that still listens to him.\n\nEnd the traitor. End his army. And then, masters - tea. +coop.m20.story = With the High Marshal gone, Mossgrim stands alone – up in the forest, in the sun, of all places. He has taken the shape of an ember wyrm and gathered every creature that still listens to him.\n\nClimb out of the rock and end the traitor. End his army. And then, masters - tea. coop.m20.start = Mossgrim, you old fungus. The league sends its regards. coop.m20.goal = Defeat Mossgrim and all his creatures. coop.m20.boss = Mossgrim is no more. The moss will grow back. He will not. diff --git a/lang/es.lang b/lang/es.lang index ae75a19..50166cd 100644 --- a/lang/es.lang +++ b/lang/es.lang @@ -572,7 +572,7 @@ camp.m29.story = Islas de lava, amo, con fuentes de maná hirviendo en el centro camp.m20.title = El Gran Maestre camp.m20.story = El Gran Maestre Valerian Escudoclaro espera en su ciudadela al otro lado del gran río, con el último fragmento y la puerta de la orden. Lleva cien años rezando, lustrando y preparándose. | Destruye su puerta y recupera el fragmento. Entonces tu núcleo estará completo, y todos los señores que alguna vez lo quisieron vendrán a por él a la vez. Cada cosa a su tiempo. camp.m30.title = El trono de las profundidades -camp.m30.story = Pasó lo que dije: tu núcleo está completo y ahora todo el mundo lo quiere. Mossgrim y Lady Nightwell marchan juntos, y lo que queda de la Orden abre su puerta por última vez. | Destruye ambos núcleos de señores y la puerta de la orden. Después de esto, las profundidades tendrán exactamente un amo. Adivina quién. Pista: yo no, yo soy el del té. +camp.m30.story = Pasó lo que dije: tu núcleo está entero y ahora todos lo quieren. Mossgrim y Lady Nightwell han excavado hasta la superficie, y el Alto Mariscal espera en su fortaleza del bosque: luz del día, pájaros, todo el lote. Asqueroso. | Sal de la roca, destruye los dos núcleos de los maestros y la puerta de la orden dentro de la fortaleza. Después, el mundo tendrá exactamente un maestro. Adivina quién. Pista: yo no, yo soy el del té. camp.epilogue = El núcleo verde se desmorona, el azul se apaga y la puerta de la orden enmudece. En algún lugar de arriba, la Guardia Luminosa redacta un informe larguísimo, y las cartas de Lady Nightwell han dejado de llegar. | Dedotuerto ha preparado té. Vuelves a estar completo, amo. El inframundo es tuyo. lair.arrivals = {0} camas libres: las nuevas criaturas llegan al {1}% de velocidad job.help = Ayudando @@ -1540,7 +1540,7 @@ coop.m19.boss = ¡El Gran Mariscal ha caído! Su armadura tintinea como un cajó coop.m19.t1 = Espera en el este. Que espere. Acabad primero con los guardias. coop.m19.t2 = Otra vez caballeros y arqueros. A la Orden se le acaban las ideas. coop.m20.title = La caída de Mossgrim -coop.m20.story = Sin el Gran Mariscal, Mossgrim está solo. Ha adoptado la forma de un dragón de brasas y ha reunido a todas las criaturas que aún le obedecen.\n\nAcabad con el traidor. Acabad con su ejército. Y después, maestros: té. +coop.m20.story = Caído el Alto Mariscal, Mossgrim está solo: arriba, en el bosque, al sol, nada menos. Ha tomado la forma de una sierpe de brasas y ha reunido a toda criatura que aún le obedece.\n\nSalid de la roca y acabad con el traidor. Acabad con su ejército. Y luego, maestros: té. coop.m20.start = Mossgrim, viejo hongo. La liga te manda saludos. coop.m20.goal = Derrotad a Mossgrim y a todas sus criaturas. coop.m20.boss = Mossgrim ya no existe. El musgo volverá a crecer. Él no. diff --git a/lang/fi.lang b/lang/fi.lang index 6e880bc..9f602f6 100644 --- a/lang/fi.lang +++ b/lang/fi.lang @@ -572,7 +572,7 @@ camp.m29.story = Laavasaaria, mestari, keskellä kiehuvia manalähteitä, ja sul camp.m20.title = Suurmestari camp.m20.story = Suurmestari Valerian Kirkaskilpi odottaa linnoituksessaan suuren joen takana, mukanaan viimeinen siru ja ritarikunnan portti. Hän on rukoillut, kiillottanut ja valmistautunut sata vuotta. | Tuhoa hänen porttinsa ja ota siru takaisin. Silloin ytimesi on ehjä - ja jokainen mestari, joka on sitä koskaan halunnut, tulee hakemaan sitä yhtä aikaa. Yksi asia kerrallaan. camp.m30.title = Syvyyksien valtaistuin -camp.m30.story = Kävi niin kuin sanoin: ytimesi on ehjä, ja nyt kaikki haluavat sen. Mossgrim ja Lady Nightwell marssivat yhdessä, ja ritarikunnan rippeet avaavat porttinsa vielä kerran. | Tuhoa molemmat mestarien ytimet ja ritarikunnan portti. Sen jälkeen syvyyksillä on täsmälleen yksi mestari. Arvaa kuka. Vihje: en minä, minä olen teemies. +camp.m30.story = Kävi kuten sanoin: ytimesi on ehjä, ja nyt kaikki haluavat sen. Mossgrim ja Lady Nightwell ovat kaivautuneet pintaan, ja ylimarsalkka odottaa linnoituksessaan metsässä – päivänvaloa, lintuja, koko paketti. Inhottavaa. | Kiipeä ulos kalliosta, tuhoa molemmat mestariytimet ja ritarikunnan portti linnoituksen sisällä. Sen jälkeen maailmalla on tasan yksi mestari. Arvaa kuka. Vihje: en minä, minä olen teemies. camp.epilogue = Vihreä ydin murenee, sininen sammuu, ja ritarikunnan portti hiljenee. Jossain yläpuolella Valonvartio kirjoittaa hyvin pitkää raporttia, eivätkä Lady Nightwellin kirjeet enää tule. | Kierosormi on keittänyt teetä. Olet ehjä, mestari. Alamaailma on sinun. lair.arrivals = Vapaita vuoteita {0}: uusia olentoja saapuu {1}% nopeudella job.help = Auttaa @@ -1540,7 +1540,7 @@ coop.m19.boss = Ylimarsalkka on kaatunut! Hänen haarniskansa kolisee kuin pudon coop.m19.t1 = Hän odottaa idässä. Antaa odottaa. Raivatkaa ensin vartijat. coop.m19.t2 = Taas ritareita ja jousimiehiä. Ritarikunnalta loppuvat ideat. coop.m20.title = Mossgrimin tuho -coop.m20.story = Ylimarsalkan poistuttua Mossgrim seisoo yksin. Hän on ottanut hehkulohikäärmeen hahmon ja koonnut jokaisen olennon, joka vielä tottelee häntä.\n\nLopettakaa petturi. Lopettakaa hänen armeijansa. Ja sitten, mestarit - teetä. +coop.m20.story = Ylimarsalkan kaaduttua Mossgrim on yksin – ylhäällä metsässä, auringossa, kaikista paikoista. Hän on ottanut hehkulohikäärmeen hahmon ja koonnut jokaisen olennon, joka yhä kuuntelee häntä.\n\nKiivetkää ulos kalliosta ja tehkää loppu petturista. Hänen armeijastaan. Ja sitten, mestarit – teetä. coop.m20.start = Mossgrim, vanha sienesi. Liitto lähettää terveisiä. coop.m20.goal = Kukistakaa Mossgrim ja kaikki hänen olentonsa. coop.m20.boss = Mossgrimia ei enää ole. Sammal kasvaa takaisin. Hän ei. diff --git a/lang/hr.lang b/lang/hr.lang index ad0b8f9..c007fc6 100644 --- a/lang/hr.lang +++ b/lang/hr.lang @@ -572,7 +572,7 @@ camp.m29.story = Otoci od lave, gospodaru, s izvorima mane koji ključaju u sred camp.m20.title = Veliki meštar camp.m20.story = Veliki meštar Valerijan Svijetloštit čeka u svojoj citadeli iza velike rijeke, s posljednjom krhotinom i vratima reda. Sto godina se molio, glancao i pripremao. | Uništi njegova vrata i vrati krhotinu. Tada je tvoja jezgra cijela - a svaki gospodar koji ju je ikad želio doći će po nju odjednom. Jedno po jedno. camp.m30.title = Prijestolje dubina -camp.m30.story = Dogodilo se kako sam rekao: tvoja je jezgra cijela, i sad je svi žele. Mossgrim i Lady Nightwell marširaju zajedno, a ono što je ostalo od Reda otvara svoja vrata posljednji put. | Uništi obje jezgre gospodara i vrata reda. Nakon toga dubine imaju točno jednog gospodara. Pogodi koga. Savjet: ne mene, ja sam onaj s čajem. +camp.m30.story = Bilo je kako sam rekao: tvoja jezgra je cijela i sad je svi žele. Mossgrim i Lady Nightwell prokopali su se do površine, a visoki maršal čeka u svojoj tvrđavi u šumi – dnevno svjetlo, ptice, cijeli paket. Odvratno. | Izađi iz stijene, uništi obje jezgre gospodara i vrata reda u tvrđavi. Nakon toga svijet ima točno jednog gospodara. Pogodi koga. Savjet: ne mene, ja sam čajdžija. camp.epilogue = Zelena jezgra se mrvi, plava se gasi, a vrata reda utihnu. Negdje gore Svjetlostraža piše vrlo dugačak izvještaj, a pisma Lady Nightwell prestala su stizati. | Krivoprst je skuhao čaj. Cijel si, gospodaru. Podzemlje je tvoje. lair.arrivals = Slobodni kreveti: {0} - nova stvorenja stižu brzinom od {1}% job.help = Pomaže @@ -1540,7 +1540,7 @@ coop.m19.boss = Visoki maršal je pao! Oklop mu zvecka kao ispala ladica s pribo coop.m19.t1 = Čeka na istoku. Neka čeka. Najprije počistite stražu. coop.m19.t2 = Opet vitezovi i strijelci. Redu ponestaje ideja. coop.m20.title = Mossgrimov pad -coop.m20.story = Kad Visokog maršala više nema, Mossgrim stoji sam. Poprimio je oblik žarnog zmaja i okupio svako stvorenje koje ga još sluša.\n\nOkončajte izdajnika. Okončajte njegovu vojsku. A onda, gospodari - čaj. +coop.m20.story = Bez visokog maršala Mossgrim je sam – gore u šumi, na suncu, baš tamo. Poprimio je oblik žarnog zmaja i okupio svako stvorenje koje ga još sluša.\n\nIzađite iz stijene i dokrajčite izdajnika. Dokrajčite njegovu vojsku. A onda, gospodari – čaj. coop.m20.start = Mossgrime, stara gljivo. Savez te pozdravlja. coop.m20.goal = Porazite Mossgrima i sva njegova stvorenja. coop.m20.boss = Mossgrima više nema. Mahovina će ponovo izrasti. On neće. diff --git a/lang/hu.lang b/lang/hu.lang index d0117e9..5bd64dd 100644 --- a/lang/hu.lang +++ b/lang/hu.lang @@ -572,7 +572,7 @@ camp.m29.story = Lávaszigetek, mester, közepükön forrongó manaforrásokkal, camp.m20.title = A Nagymester camp.m20.story = Valerian Fénypajzs Nagymester a nagy folyón túli citadellájában vár, az utolsó szilánkkal és a Rend kapujával. Száz évig imádkozott, suvickolt és készülődött. | Pusztítsd el a kapuját, és szerezd vissza a szilánkot. Akkor a magod egész lesz - és minden mester, aki valaha akarta, egyszerre jön majd érte. Egyszerre csak egyet. camp.m30.title = A mélység trónja -camp.m30.story = Úgy történt, ahogy mondtam: a magod egész, és most mindenki azt akarja. Mossgrim és Lady Nightwell együtt menetelnek, és ami a Rendből maradt, utoljára még kinyitja a kapuját. | Pusztítsd el mindkét mestermagot és a Rend kapuját. Ezután a mélységnek pontosan egy ura lesz. Találd ki, ki. Segítek: nem én, én vagyok a teafőző. +camp.m30.story = Úgy lett, ahogy mondtam: a magod ép, és most mindenki akarja. Mossgrim és Lady Nightwell felásták magukat a felszínre, a főmarsall pedig az erdei erődjében vár – napfény, madarak, a teljes csomag. Undorító. | Mássz ki a sziklából, pusztítsd el mindkét mester magját és a rend kapuját az erődben. Utána a világnak pontosan egy mestere lesz. Találd ki, ki. Tipp: nem én, én a teás vagyok. camp.epilogue = A zöld mag szétmorzsolódik, a kék kialszik, és a Rend kapuja elnémul. Valahol odafent a Fényőrség egy nagyon hosszú jelentést ír, Lady Nightwell levelei pedig már nem érkeznek. | Görbeujj teát főzött. Újra egész vagy, mester. Tiéd az alvilág. lair.arrivals = {0} szabad ágy: az új lények érkezési sebessége {1}% job.help = Segít @@ -1540,7 +1540,7 @@ coop.m19.boss = A Főmarsall elesett! A páncélja úgy csörömpöl, mint egy l coop.m19.t1 = Keleten vár. Hadd várjon. Előbb tisztítsátok meg a terepet az őreitől. coop.m19.t2 = Megint lovagok és íjászok. A Rendnek elfogynak az ötletei. coop.m20.title = Mossgrim bukása -coop.m20.story = A Főmarsall eltűntével Mossgrim egyedül maradt. Parázssárkány alakját öltötte, és összegyűjtött minden lényt, amely még hallgat rá.\n\nVégezzetek az árulóval. Végezzetek a seregével. És aztán, mesterek - tea. +coop.m20.story = A főmarsall bukása után Mossgrim egyedül maradt – fent az erdőben, a napon, éppen ott. Parázssárkány alakját öltötte, és minden lényt összegyűjtött, aki még hallgat rá.\n\nMásszatok ki a sziklából, és végezzetek az árulóval. A seregével. Aztán, mesterek – tea. coop.m20.start = Mossgrim, te vén gomba. A szövetség üdvözletét küldi. coop.m20.goal = Győzd le Mossgrimot és minden lényét. coop.m20.boss = Mossgrim nincs többé. A moha visszanő. Ő nem. diff --git a/lang/it.lang b/lang/it.lang index a2eef06..f1fc935 100644 --- a/lang/it.lang +++ b/lang/it.lang @@ -572,7 +572,7 @@ camp.m29.story = Isole di lava, maestro, con fonti di mana che ribollono nel mez camp.m20.title = Il Gran Maestro camp.m20.story = Il Gran Maestro Valeriano Scudolucente attende nella sua cittadella oltre il grande fiume, con l'ultimo frammento e la porta dell'ordine. Per cento anni ha pregato, lucidato e si è preparato. | Distruggi la sua porta e riprenditi il frammento. Allora il tuo nucleo sarà intero - e ogni maestro che l'abbia mai voluto verrà a prenderselo tutto in una volta. Una cosa alla volta. camp.m30.title = Il trono degli abissi -camp.m30.story = È andata come dicevo: il tuo nucleo è intero, e ora lo vogliono tutti. Mossgrim e Lady Nightwell marciano insieme, e ciò che resta dell'Ordine apre la sua porta un'ultima volta. | Distruggi entrambi i nuclei dei maestri e la porta dell'ordine. Dopo, gli abissi avranno esattamente un maestro. Indovina chi. Un indizio: non io, io sono quello del tè. +camp.m30.story = È andata come dicevo: il tuo nucleo è intero, e ora lo vogliono tutti. Mossgrim e Lady Nightwell hanno scavato fino in superficie, e l'Alto Maresciallo aspetta nella sua fortezza nel bosco: luce del giorno, uccelli, tutto il pacchetto. Disgustoso. | Esci dalla roccia, distruggi entrambi i nuclei dei maestri e la porta dell'ordine dentro la fortezza. Dopo, il mondo avrà un solo maestro. Indovina chi. Suggerimento: non io, io sono quello del tè. camp.epilogue = Il nucleo verde si sbriciola, quello blu si spegne e la porta dell'ordine tace. Da qualche parte lassù, la Guardia della Luce sta scrivendo un rapporto lunghissimo, e le lettere di Lady Nightwell hanno smesso di arrivare. | Ditastorte ha preparato il tè. Sei di nuovo intero, maestro. Gli inferi sono tuoi. lair.arrivals = {0} letti liberi: le nuove creature arrivano al {1}% della velocità job.help = Aiuta @@ -1540,7 +1540,7 @@ coop.m19.boss = Il Gran Maresciallo è caduto! La sua armatura sferraglia come u coop.m19.t1 = Aspetta a est. Lasciatelo aspettare. Prima eliminate le guardie. coop.m19.t2 = Di nuovo cavalieri e arciere. L'Ordine sta finendo le idee. coop.m20.title = La caduta di Mossgrim -coop.m20.story = Senza il Gran Maresciallo, Mossgrim è rimasto solo. Ha preso la forma di un drago di brace e ha radunato tutte le creature che gli danno ancora retta.\n\nFinite il traditore. Finite il suo esercito. E poi, maestri: tè. +coop.m20.story = Caduto l'Alto Maresciallo, Mossgrim è solo: su nel bosco, al sole, figurarsi. Ha preso la forma di un drago di brace e radunato ogni creatura che ancora lo ascolta.\n\nUscite dalla roccia e finite il traditore. Finite il suo esercito. E poi, maestri: tè. coop.m20.start = Mossgrim, vecchio fungo. La lega ti manda i suoi saluti. coop.m20.goal = Sconfiggete Mossgrim e tutte le sue creature. coop.m20.boss = Mossgrim non c'è più. Il muschio ricrescerà. Lui no. diff --git a/lang/nl.lang b/lang/nl.lang index 8c2cf03..78a70be 100644 --- a/lang/nl.lang +++ b/lang/nl.lang @@ -572,7 +572,7 @@ camp.m29.story = Lava-eilanden, meester, met kokende manabronnen in het midden, camp.m20.title = De Grootmeester camp.m20.story = Grootmeester Valerian Helderschild wacht in zijn citadel aan de overkant van de grote rivier, met de laatste scherf en de poort van de orde. Honderd jaar lang heeft hij gebeden, gepoetst en zich voorbereid. | Vernietig zijn poort en haal de scherf terug. Dan is je kern heel - en elke meester die hem ooit wilde hebben, komt er tegelijk op af. Een ding tegelijk. camp.m30.title = De troon van de diepte -camp.m30.story = Het ging zoals ik zei: je kern is heel, en nu wil iedereen hem hebben. Mossgrim en Lady Nightwell trekken samen op, en wat er over is van de Orde opent nog een laatste keer haar poort. | Vernietig beide meesterkernen en de poort van de orde. Daarna heeft de diepte precies een meester. Raad eens wie. Tip: niet ik, ik ben van de thee. +camp.m30.story = Het ging zoals ik zei: je kern is heel, en nu wil iedereen hem. Mossgrim en Lady Nightwell hebben zich naar de oppervlakte gegraven, en de Hoge Maarschalk wacht in zijn burcht in het bos – daglicht, vogels, het hele pakket. Walgelijk. | Klim uit de rots, vernietig beide meesterkernen en de poort van de orde in de burcht. Daarna heeft de wereld precies één meester. Raad eens wie. Tip: ik niet, ik ben van de thee. camp.epilogue = De groene kern brokkelt af, de blauwe dooft, en de poort van de orde valt stil. Ergens boven schrijft de Lichtwacht een heel lang rapport, en de brieven van Lady Nightwell komen niet meer. | Krommevinger heeft thee gezet. Je bent heel, meester. De onderwereld is van jou. lair.arrivals = {0} vrije bedden: nieuwe wezens komen met {1}% snelheid job.help = Helpt @@ -1540,7 +1540,7 @@ coop.m19.boss = De Hoge Maarschalk is gevallen! Zijn harnas rammelt als een geva coop.m19.t1 = Hij wacht in het oosten. Laat hem wachten. Ruim eerst de wachters op. coop.m19.t2 = Alweer ridders en boogschutters. De Orde raakt door haar ideeën heen. coop.m20.title = Mossgrims val -coop.m20.story = Nu de Hoge Maarschalk weg is, staat Mossgrim alleen. Hij heeft de gedaante van een gloeddraak aangenomen en elk wezen verzameld dat nog naar hem luistert.\n\nMaak een eind aan de verrader. Maak een eind aan zijn leger. En dan, meesters - thee. +coop.m20.story = Zonder de Hoge Maarschalk staat Mossgrim alleen – boven in het bos, in de zon nota bene. Hij heeft de gedaante van een gloedworm aangenomen en elk wezen verzameld dat nog naar hem luistert.\n\nKlim uit de rots en maak een eind aan de verrader. Aan zijn leger. En dan, meesters – thee. coop.m20.start = Mossgrim, ouwe schimmel. De liga laat je groeten. coop.m20.goal = Versla Mossgrim en al zijn wezens. coop.m20.boss = Mossgrim is niet meer. Het mos groeit wel terug. Hij niet. diff --git a/lang/no.lang b/lang/no.lang index 4e55985..c32c69d 100644 --- a/lang/no.lang +++ b/lang/no.lang @@ -571,7 +571,7 @@ camp.m29.story = Lavaøyer, mester, med manakilder som koker i midten, og en for camp.m20.title = Stormesteren camp.m20.story = Stormester Valerian Lysskjold venter i citadellet sitt bortenfor den store elven, med det siste skåret og ordenens port. Han har bedt, pusset og forberedt seg i hundre år. | Ødelegg porten hans og ta tilbake skåret. Da er kjernen din hel - og hver eneste mester som noen gang har villet ha den, kommer etter den på én gang. Én ting om gangen. camp.m30.title = Dypets trone -camp.m30.story = Det gikk som jeg sa: kjernen din er hel, og nå vil alle ha den. Mossgrim og Lady Nightwell marsjerer sammen, og det som er igjen av Ordenen, åpner porten sin en siste gang. | Ødelegg begge mesterkjernene og ordenens port. Etter dette har dypet nøyaktig én mester. Gjett hvem. Et hint: ikke meg, jeg er han med teen. +camp.m30.story = Det gikk som jeg sa: kjernen din er hel, og nå vil alle ha den. Mossgrim og Lady Nightwell har gravd seg opp til overflaten, og høymarskalken venter i festningen sin i skogen – dagslys, fugler, hele pakka. Ekkelt. | Klatre ut av fjellet, ødelegg begge mesterkjernene og ordenens port inne i festningen. Etter dette har verden nøyaktig én mester. Gjett hvem. Hint: ikke meg, jeg er temannen. camp.epilogue = Den grønne kjernen smuldrer, den blå blir mørk, og ordenens port blir stille. Et sted der oppe skriver Lysvakten en veldig lang rapport, og Lady Nightwells brev har sluttet å komme. | Krokfinger har laget te. Du er hel, mester. Underverdenen er din. lair.arrivals = {0} ledige senger: nye skapninger ankommer med {1}% fart job.help = Hjelper @@ -1539,7 +1539,7 @@ coop.m19.boss = Høymarskalken har falt! Rustningen hans skrangler som en mistet coop.m19.t1 = Han venter i øst. La ham vente. Rydd unna vaktene først. coop.m19.t2 = Riddere og bueskyttere igjen. Ordenen begynner å gå tom for ideer. coop.m20.title = Mossgrims fall -coop.m20.story = Med høymarskalken borte står Mossgrim alene. Han har tatt skikkelse av en glødlindorm og samlet hver eneste skapning som fortsatt lytter til ham.\n\nGjør slutt på forræderen. Gjør slutt på hæren hans. Og så, mestere - te. +coop.m20.story = Uten høymarskalken står Mossgrim alene – oppe i skogen, i sola, av alle steder. Han har tatt form av en glødorm og samlet alle skapninger som fortsatt lytter til ham.\n\nKlatre ut av fjellet og gjør slutt på forræderen. På hæren hans. Og så, mestere – te. coop.m20.start = Mossgrim, din gamle sopp. Forbundet sender sine hilsener. coop.m20.goal = Beseir Mossgrim og alle skapningene hans. coop.m20.boss = Mossgrim er ikke mer. Mosen gror tilbake. Det gjør ikke han. diff --git a/lang/pt.lang b/lang/pt.lang index b16daa4..2762ad4 100644 --- a/lang/pt.lang +++ b/lang/pt.lang @@ -572,7 +572,7 @@ camp.m29.story = Ilhas de lava, amo, com fontes de mana a ferver no meio, e uma camp.m20.title = O Grão-Mestre camp.m20.story = O Grão-Mestre Valerian Escudo-Claro espera na sua cidadela para lá do grande rio, com o último fragmento e o portão da ordem. Rezou, poliu e preparou-se durante cem anos. | Destrói o portão dele e recupera o fragmento. Então o teu núcleo estará inteiro - e todos os mestres que alguma vez o quiseram virão buscá-lo ao mesmo tempo. Uma coisa de cada vez. camp.m30.title = O Trono das Profundezas -camp.m30.story = Aconteceu como eu disse: o teu núcleo está inteiro, e agora toda a gente o quer. O Mossgrim e a Lady Nightwell marcham juntos, e o que resta da Ordem abre o portão uma última vez. | Destrói os dois núcleos dos mestres e o portão da ordem. Depois disto, as profundezas têm exatamente um mestre. Adivinha quem. Dica: eu não, eu sou o do chá. +camp.m30.story = Aconteceu como eu disse: o teu núcleo está inteiro e agora todos o querem. Mossgrim e Lady Nightwell escavaram até à superfície, e o Alto Marechal espera na sua fortaleza na floresta – luz do dia, pássaros, o pacote completo. Nojento. | Sai da rocha, destrói os dois núcleos dos mestres e o portão da ordem dentro da fortaleza. Depois disto o mundo terá exatamente um mestre. Adivinha quem. Pista: eu não, eu sou o do chá. camp.epilogue = O núcleo verde desfaz-se, o azul apaga-se e o portão da ordem cai em silêncio. Algures lá em cima, a Guarda da Luz escreve um relatório muito longo, e as cartas da Lady Nightwell deixaram de chegar. | O Dedotorto fez chá. Estás inteiro, amo. O submundo é teu. lair.arrivals = {0} camas livres: novas criaturas chegam a {1}% da velocidade job.help = A ajudar @@ -1540,7 +1540,7 @@ coop.m19.boss = O Alto Marechal caiu! A armadura dele chocalha como uma gaveta d coop.m19.t1 = Ele espera a este. Deixem-no esperar. Primeiro limpem os guardas. coop.m19.t2 = Outra vez cavaleiros e arqueiros. A Ordem está a ficar sem ideias. coop.m20.title = A Queda do Mossgrim -coop.m20.story = Sem o Alto Marechal, o Mossgrim está sozinho. Tomou a forma de uma serpe de brasa e reuniu todas as criaturas que ainda lhe obedecem.\n\nAcabem com o traidor. Acabem com o exército dele. E depois, amos - chá. +coop.m20.story = Com o Alto Marechal caído, Mossgrim está sozinho – lá em cima, na floresta, ao sol, imagine-se. Tomou a forma de uma serpe de brasa e reuniu todas as criaturas que ainda o escutam.\n\nSaí da rocha e acabai com o traidor. Acabai com o seu exército. E depois, mestres – chá. coop.m20.start = Mossgrim, seu velho fungo. A liga manda cumprimentos. coop.m20.goal = Derrotem o Mossgrim e todas as suas criaturas. coop.m20.boss = O Mossgrim já não existe. O musgo volta a crescer. Ele não. diff --git a/lang/ro.lang b/lang/ro.lang index 7a679cd..b8e3846 100644 --- a/lang/ro.lang +++ b/lang/ro.lang @@ -572,7 +572,7 @@ camp.m29.story = Insule de lavă, stăpâne, cu izvoare de mana clocotind la mij camp.m20.title = Marele Maestru camp.m20.story = Marele Maestru Valerian Scutluminos așteaptă în citadela lui de dincolo de marele râu, cu ultimul ciob și poarta ordinului. O sută de ani s-a rugat, a lustruit și s-a pregătit. | Distruge-i poarta și ia ciobul înapoi. Atunci miezul tău va fi întreg - și fiecare stăpân care l-a vrut vreodată va veni după el deodată. Pe rând, pe rând. camp.m30.title = Tronul adâncurilor -camp.m30.story = S-a întâmplat cum am zis: miezul tău e întreg și acum toată lumea îl vrea. Mossgrim și Lady Nightwell mărșăluiesc împreună, iar ce a mai rămas din Ordin își deschide poarta o ultimă dată. | Distruge ambele miezuri ale stăpânilor și poarta ordinului. După asta, adâncurile au exact un stăpân. Ghici cine. Indiciu: nu eu, eu sunt omul cu ceaiul. +camp.m30.story = S-a întâmplat cum am zis: nucleul tău e întreg, iar acum toți îl vor. Mossgrim și Lady Nightwell și-au săpat drum până la suprafață, iar Înaltul Mareșal așteaptă în fortăreața lui din pădure – lumina zilei, păsări, tot pachetul. Dezgustător. | Ieși din stâncă, distruge ambele nuclee ale stăpânilor și poarta ordinului din fortăreață. După asta lumea va avea exact un stăpân. Ghicește cine. Indiciu: nu eu, eu sunt omul cu ceaiul. camp.epilogue = Miezul verde se fărâmițează, cel albastru se stinge, iar poarta ordinului amuțește. Undeva sus, Straja Luminii scrie un raport foarte lung, iar scrisorile lui Lady Nightwell nu mai vin. | Degetstrâmb a făcut ceai. Ești întreg, stăpâne. Lumea de dedesubt e a ta. lair.arrivals = {0} paturi libere: creaturile noi sosesc cu {1}% viteză job.help = Ajută @@ -1540,7 +1540,7 @@ coop.m19.boss = Mareșalul Suprem a căzut! Armura lui zăngăne ca un sertar de coop.m19.t1 = Așteaptă la est. Lăsați-l să aștepte. Curățați întâi gărzile. coop.m19.t2 = Iar cavaleri și arcași. Ordinul rămâne fără idei. coop.m20.title = Căderea lui Mossgrim -coop.m20.story = Cu Mareșalul Suprem dispărut, Mossgrim a rămas singur. A luat forma unui balaur de jar și a adunat fiecare creatură care încă îl mai ascultă.\n\nTerminați-l pe trădător. Terminați-i armata. Iar apoi, stăpâni - ceai. +coop.m20.story = Fără Înaltul Mareșal, Mossgrim e singur – sus în pădure, în soare, tocmai acolo. A luat chipul unui balaur de jar și a strâns toate creaturile care încă îl ascultă.\n\nIeșiți din stâncă și terminați-l pe trădător. Terminați-i oastea. Și apoi, stăpâni – ceai. coop.m20.start = Mossgrim, ciupercă bătrână ce ești. Liga îți transmite salutări. coop.m20.goal = Învingeți-l pe Mossgrim și toate creaturile lui. coop.m20.boss = Mossgrim nu mai e. Mușchiul va crește la loc. El nu. diff --git a/lang/ru.lang b/lang/ru.lang index cab901e..ccd01fd 100644 --- a/lang/ru.lang +++ b/lang/ru.lang @@ -572,7 +572,7 @@ camp.m29.story = Лавовые острова, хозяин, посреди н camp.m20.title = Великий магистр camp.m20.story = Великий магистр Валериан Светлощит ждёт в своей цитадели за великой рекой, с последним осколком и вратами ордена. Сто лет он молился, полировал и готовился. | Разрушь его врата и верни осколок. Тогда твоё ядро станет целым - и все хозяева, что когда-либо его хотели, явятся за ним разом. Всё по порядку. camp.m30.title = Трон глубин -camp.m30.story = Вышло, как я и говорил: твоё ядро целое, и теперь его хотят все. Моссгрим и леди Найтвелл идут вместе, а остатки Ордена в последний раз открывают свои врата. | Уничтожь оба ядра хозяев и врата ордена. После этого у глубин будет ровно один хозяин. Угадай кто. Подсказка: не я, я тут по части чая. +camp.m30.story = Вышло, как я говорил: ваше ядро цело, и теперь его хотят все. Моссгрим и леди Найтвелл прокопались на поверхность, а верховный маршал ждёт в своей крепости в лесу — дневной свет, птички, полный набор. Мерзость. | Выберитесь из скалы, уничтожьте оба ядра мастеров и врата ордена в крепости. После этого в мире будет ровно один мастер. Угадайте кто. Подсказка: не я, я чайный. camp.epilogue = Зелёное ядро рассыпается, синее гаснет, и врата ордена умолкают. Где-то наверху Светлый Дозор пишет очень длинный отчёт, а письма леди Найтвелл больше не приходят. | Кривопал заварил чай. Ты снова целый, хозяин. Подземелье твоё. lair.arrivals = {0} свободных мест: новые существа приходят со скоростью {1}% job.help = Помогает @@ -1540,7 +1540,7 @@ coop.m19.boss = Верховный маршал пал! Его доспехи г coop.m19.t1 = Он ждёт на востоке. Пусть ждёт. Сначала разберитесь со стражей. coop.m19.t2 = Снова рыцари и лучницы. У Ордена кончаются идеи. coop.m20.title = Падение Моссгрима -coop.m20.story = Без Верховного маршала Моссгрим остался один. Он принял облик огненного змия и собрал всех существ, которые ещё его слушают.\n\nПокончите с предателем. Покончите с его армией. А потом, повелители, - чай. +coop.m20.story = Без верховного маршала Моссгрим остался один — наверху, в лесу, на солнце, подумать только. Он принял облик огненного змея и собрал всех существ, что ещё его слушают.\n\nВыберитесь из скалы и покончите с предателем. Покончите с его армией. А потом, мастера, — чай. coop.m20.start = Моссгрим, старый гриб. Лига шлёт тебе привет. coop.m20.goal = Победите Моссгрима и всех его существ. coop.m20.boss = Моссгрима больше нет. Мох отрастёт. Он - нет. diff --git a/lang/sk.lang b/lang/sk.lang index 69c6329..be58b26 100644 --- a/lang/sk.lang +++ b/lang/sk.lang @@ -572,7 +572,7 @@ camp.m29.story = Lávové ostrovy, pane, s prameňmi many vrúcimi uprostred, a camp.m20.title = Veľmajster camp.m20.story = Veľmajster Valerián Jasnoštít čaká vo svojej citadele za veľkou riekou, s posledným črepom a bránou rádu. Sto rokov sa modlil, leštil a pripravoval. | Znič jeho bránu a vezmi si črep späť. Potom bude tvoje jadro celé - a každý majster, ktorý ho kedy chcel, si poň príde naraz. Pekne jedno po druhom. camp.m30.title = Trón hlbín -camp.m30.story = Stalo sa, ako som hovoril: tvoje jadro je celé a teraz ho chce každý. Mossgrim a Lady Nightwell tiahnu spolu a čo zostalo z Rádu, otvára svoju bránu naposledy. | Znič obe jadrá majstrov aj bránu rádu. Potom budú mať hlbiny presne jedného pána. Hádaj koho. Nápoveda: mňa nie, ja som tu cez čaj. +camp.m30.story = Stalo sa, ako som vravel: tvoje jadro je celé a teraz ho chce každý. Mossgrim a lady Nightwell sa prekopali na povrch a vysoký maršal čaká vo svojej pevnosti v lese – denné svetlo, vtáky, celý balík. Odporné. | Vylez zo skaly, znič obe jadrá pánov a bránu rádu v pevnosti. Potom bude mať svet presne jedného pána. Hádaj koho. Tip: nie mňa, ja som čajový. camp.epilogue = Zelené jadro sa rozpadá, modré hasne a brána rádu stíchne. Kdesi hore píše Svetlá stráž veľmi dlhé hlásenie a listy Lady Nightwell prestali chodiť. | Krivoprst uvaril čaj. Si celý, pane. Podsvetie je tvoje. lair.arrivals = Voľné lôžka: {0}, nové tvory prichádzajú rýchlosťou {1} % job.help = Pomáha @@ -1540,7 +1540,7 @@ coop.m19.boss = Vrchný maršal padol! Jeho zbroj rinčí ako spadnutá zásuvka coop.m19.t1 = Čaká na východe. Nech čaká. Najprv vyčistite stráže. coop.m19.t2 = Zase rytieri a lukostrelkyne. Rádu dochádzajú nápady. coop.m20.title = Mossgrimov pád -coop.m20.story = Keď je vrchný maršal preč, Mossgrim zostal sám. Vzal na seba podobu žeravého šarkana a zhromaždil každého tvora, ktorý ho ešte počúva.\n\nSkoncujte so zradcom. Skoncujte s jeho armádou. A potom, páni - čaj. +coop.m20.story = Bez vysokého maršala je Mossgrim sám – hore v lese, na slnku, práve tam. Prijal podobu žeravého draka a zhromaždil každú bytosť, ktorá ho ešte počúva.\n\nVylezte zo skaly a skoncujte so zradcom. S jeho armádou. A potom, páni – čaj. coop.m20.start = Mossgrim, ty stará huba. Liga ťa pozdravuje. coop.m20.goal = Porazte Mossgrima a všetky jeho tvory. coop.m20.boss = Mossgrim už nie je. Mach zase dorastie. On nie. diff --git a/lang/sr.lang b/lang/sr.lang index f8131e3..0a3f876 100644 --- a/lang/sr.lang +++ b/lang/sr.lang @@ -572,7 +572,7 @@ camp.m29.story = Острва од лаве, господару, с извори camp.m20.title = Велики мајстор camp.m20.story = Велики мајстор Валеријан Светлоштит чека у својој цитадели иза велике реке, с последњом крхотином и капијом реда. Сто година се молио, гланцао и припремао. | Уништи његову капију и врати крхотину. Тада је твоје језгро цело - а сваки господар који га је икад желео доћи ће по њега одједном. Једно по једно. camp.m30.title = Престо дубина -camp.m30.story = Догодило се како сам рекао: твоје језгро је цело, и сад га сви желе. Мосгрим и Лејди Најтвел марширају заједно, а оно што је остало од Реда отвара своју капију последњи пут. | Уништи оба језгра господара и капију реда. После тога дубине имају тачно једног господара. Погоди кога. Савет: не мене, ја сам онај с чајем. +camp.m30.story = Било је како сам рекао: твоје језгро је цело и сад га сви желе. Мосгрим и леди Најтвел прокопали су се до површине, а високи маршал чека у својој тврђави у шуми – дневна светлост, птице, цео пакет. Одвратно. | Изађи из стене, уништи оба језгра господара и капију реда у тврђави. После тога свет има тачно једног господара. Погоди кога. Савет: не мене, ја сам чајџија. camp.epilogue = Зелено језгро се мрви, плаво се гаси, а капија реда утихне. Негде горе Светлостража пише веома дугачак извештај, а писма Лејди Најтвел су престала да стижу. | Кривопрст је скувао чај. Цео си, господару. Подземље је твоје. lair.arrivals = Слободни кревети: {0} - нова створења стижу брзином од {1}% job.help = Помаже @@ -1540,7 +1540,7 @@ coop.m19.boss = Високи маршал је пао! Оклоп му звец coop.m19.t1 = Чека на истоку. Нека чека. Најпре почистите стражу. coop.m19.t2 = Опет витезови и стрелци. Реду понестаје идеја. coop.m20.title = Мосгримов пад -coop.m20.story = Кад Високог маршала више нема, Мосгрим стоји сам. Попримио је облик жарког змаја и окупио свако створење које га још слуша.\n\nОкончајте издајника. Окончајте његову војску. А онда, господари - чај. +coop.m20.story = Без високог маршала Мосгрим је сам – горе у шуми, на сунцу, баш тамо. Попримио је облик жарког змаја и окупио свако створење које га још слуша.\n\nИзађите из стене и докрајчите издајника. Докрајчите његову војску. А онда, господари – чај. coop.m20.start = Мосгриме, стара гљиво. Савез те поздравља. coop.m20.goal = Поразите Мосгрима и сва његова створења. coop.m20.boss = Мосгрима више нема. Маховина ће поново израсти. Он неће. diff --git a/lang/sv.lang b/lang/sv.lang index 53966bc..214f546 100644 --- a/lang/sv.lang +++ b/lang/sv.lang @@ -572,7 +572,7 @@ camp.m29.story = Lavaöar, mästare, med manakällor som kokar i mitten, och en camp.m20.title = Stormästaren camp.m20.story = Stormästare Valerian Ljussköld väntar i sitt citadell bortom den stora floden, med den sista skärvan och ordens port. Han har bett, putsat och förberett sig i hundra år. | Förstör hans port och ta tillbaka skärvan. Då är din kärna hel - och varenda mästare som någonsin velat ha den kommer efter den på en gång. En sak i taget. camp.m30.title = Djupets tron -camp.m30.story = Det blev som jag sa: din kärna är hel, och nu vill alla ha den. Mossgrim och Lady Nightwell marscherar tillsammans, och det som är kvar av orden öppnar sin port en sista gång. | Förstör båda mästarkärnorna och ordens port. Efter detta har djupet exakt en mästare. Gissa vem. Ledtråd: inte jag, jag är tegubben. +camp.m30.story = Det gick som jag sa: din kärna är hel, och nu vill alla ha den. Mossgrim och Lady Nightwell har grävt sig upp till ytan, och högmarskalken väntar i sin fästning i skogen – dagsljus, fåglar, hela paketet. Äckligt. | Klättra ut ur berget, förstör båda mästarkärnorna och ordens port inne i fästningen. Sedan har världen exakt en mästare. Gissa vem. Tips: inte jag, jag är temannen. camp.epilogue = Den gröna kärnan smulas sönder, den blå slocknar, och ordens port tystnar. Någonstans där uppe skriver Ljusvakten en mycket lång rapport, och Lady Nightwells brev har slutat komma. | Krokfinger har kokat te. Du är hel, mästare. Underjorden är din. lair.arrivals = {0} lediga sängar: nya varelser kommer i {1}% fart job.help = Hjälper till @@ -1540,7 +1540,7 @@ coop.m19.boss = Överste marskalken har fallit! Hans rustning skramlar som en ta coop.m19.t1 = Han väntar i öster. Låt honom vänta. Rensa vakterna först. coop.m19.t2 = Riddare och bågskyttar igen. Orden börjar få slut på idéer. coop.m20.title = Mossgrims fall -coop.m20.story = Med överste marskalken borta står Mossgrim ensam. Han har tagit en glödlindorms skepnad och samlat varenda varelse som fortfarande lyssnar på honom.\n\nGör slut på förrädaren. Gör slut på hans armé. Och sedan, mästare - te. +coop.m20.story = Utan högmarskalken står Mossgrim ensam – uppe i skogen, i solen, av alla ställen. Han har tagit skepnad av en glödorm och samlat varje varelse som fortfarande lyssnar på honom.\n\nKlättra ut ur berget och gör slut på förrädaren. På hans här. Och sedan, mästare – te. coop.m20.start = Mossgrim, din gamla svamp. Förbundet hälsar. coop.m20.goal = Besegra Mossgrim och alla hans varelser. coop.m20.boss = Mossgrim finns inte mer. Mossan växer tillbaka. Det gör inte han. diff --git a/server/src/netplay.rs b/server/src/netplay.rs index e08c0cc..ca3d74a 100644 --- a/server/src/netplay.rs +++ b/server/src/netplay.rs @@ -6,7 +6,8 @@ // // Lobby messages (JSON, one object per WebSocket frame): // {"t":"rooms"} -> list of open matches -// {"t":"create","sides":[0,2,3,4]?,"map_w":96?,"map_h":128?,"difficulty":1?,"mission":12?,"doc":{..}?} +// {"t":"create","sides":[0,2,3,4]?,"map_w":96?,"map_h":128?,"difficulty":1?,"mission":12?,"doc":{..}?,"surface":true?} +// -> "surface": a free match whose eastern half lies above ground // -> "doc": an editor campaign (CampaignDoc JSON) for a co-op // match of its mission "mission"; it goes along with "start" // "seed":77?,"carry":[..]? with a doc: an interrupted run goes @@ -88,6 +89,7 @@ struct Room { mission: Option, doc: Option, // editor campaign of a co-op match (sent to every client at the start) resume: Option<(u32, Value)>, // a resumed editor campaign run: its seed and what the masters carry + surface: bool, // a free match half above ground } #[derive(Debug)] @@ -382,7 +384,7 @@ impl Netplay { } let name = self.clients.get(&conn).map(|c| c.name.clone()).unwrap_or_else(|| "Guest".into()); let seats = sides.iter().map(|s| (*s, new_seat(*s, false))).collect::>(); - let room = Room { code: code.clone(), sides, seats, pending: HashMap::new(), turn: 0, started: false, paused: false, missing: false, seed: None, map_w, map_h, difficulty, mission, doc, resume }; + let room = Room { code: code.clone(), sides, seats, pending: HashMap::new(), turn: 0, started: false, paused: false, missing: false, seed: None, map_w, map_h, difficulty, mission, doc, resume, surface: msg.get("surface").and_then(|v| v.as_bool()).unwrap_or(false) }; self.rooms.insert(code.clone(), room); if let Some(c) = self.clients.get_mut(&conn) { c.room = Some(code.clone()); @@ -647,6 +649,9 @@ impl Netplay { if let Some(doc) = &r.doc { m["doc"] = doc.clone(); } + if r.surface { + m["surface"] = json!(true); + } if let Some((_, carry)) = &r.resume { m["carry"] = carry.clone(); m["resume"] = json!(true); diff --git a/src/campaign.rs b/src/campaign.rs index 9f61a05..f8776de 100644 --- a/src/campaign.rs +++ b/src/campaign.rs @@ -358,16 +358,19 @@ pub fn missions() -> Vec { .boss(Paladin, 10)], ..base("m20", (160, 160), 2020, vec![Goal::Heart, Goal::Shards]) }); + // the finale above ground: the dungeon in the rock, the eastern half a forest with the High + // Marshal's fortress (the gate of the order) and both rival masters v.push(MissionDef { portals: 3, gold: 6000.0, - gate: true, waves: true, first_wave: 420.0, gate_defenders: true, - rivers: vec![river(false, true, 0.45, 4, 2), river(true, false, 0.5, 4, 2)], - islands: vec![island((0.3, 0.2), false, true, 3000)], - rivals: vec![(0.85, 0.22, 2, 2), (0.85, 0.78, 2, 3)], + rivers: vec![river(false, true, 0.3, 4, 2)], + islands: vec![island((0.2, 0.2), false, true, 3000)], + forts: vec![fort((0.8, 0.5), (27, 25), &[3], &[Arrow, Cannon, Magic, Arrow, Cannon, Magic, Arrow, Cannon], 3, 14, 4, 4, 3, 3000).heart().boss(Paladin, 10)], + rivals: vec![(0.86, 0.15, 2, 2), (0.86, 0.85, 2, 3)], + surface: 0.48, ..base("m30", (176, 176), 3030, vec![Goal::Rivals, Goal::Heart]) }); v diff --git a/src/editor/coop_campaign.rs b/src/editor/coop_campaign.rs index 853e26a..ac1c6f7 100644 --- a/src/editor/coop_campaign.rs +++ b/src/editor/coop_campaign.rs @@ -91,7 +91,7 @@ pub fn coop_campaign() -> CampaignDoc { waves: sp.waves.0, wave_limit: sp.waves.1, first_wave: if sp.waves.0 { sp.waves.2 } else { 300.0 }, - gen: GenDoc { rivers: sp.gen.0, lava: sp.gen.1, forts: sp.gen.2, rivals: 0, difficulty: sp.gen.3, surface: false }, + gen: GenDoc { rivers: sp.gen.0, lava: sp.gen.1, forts: sp.gen.2, rivals: 0, difficulty: sp.gen.3, surface: i + 1 == specs.len() }, next: (i + 1 < specs.len()).then(|| format!("c{:02}", i + 2)), pos: (40.0 + (i % 5) as f32 * 220.0, 40.0 + (i / 5) as f32 * 140.0), ..MissionDoc::default() diff --git a/src/lobby.rs b/src/lobby.rs index 548e76e..a84bae8 100644 --- a/src/lobby.rs +++ b/src/lobby.rs @@ -90,6 +90,7 @@ pub struct StartInfo { pub teams: Vec<(u8, u8)>, // (side, team) of a versus match pub next: bool, // the next mission of a running editor campaign co-op match pub carry: Vec<(u8, crate::campaign::Carry)>, // what every side brings into that mission + pub surface: bool, // a free match whose eastern half lies above ground } #[derive(Clone, Debug, Default)] @@ -223,6 +224,18 @@ impl MatchClient { self.send_create(sides, map_w, map_h, difficulty, None); } + // a free match; `surface`: its eastern half lies above ground + pub fn create_land(&mut self, sides: &[u8], map_w: usize, map_h: usize, difficulty: u8, surface: bool) { + let n = self.outbox.len(); + self.send_create(sides, map_w, map_h, difficulty, None); + if let (true, Some(text)) = (surface, self.outbox.get_mut(n)) { + if let Ok(mut msg) = serde_json::from_str::(text) { + msg["surface"] = json!(true); + *text = msg.to_string(); + } + } + } + pub fn create_coop(&mut self, mission: usize, sides: &[u8], map_w: usize, map_h: usize, difficulty: u8) { self.send_create(sides, map_w, map_h, difficulty, Some(mission)); } @@ -550,7 +563,8 @@ impl MatchClient { // a resumed editor campaign run goes on like the next mission of a running one let resume = editor && v.get("resume").and_then(|x| x.as_bool()).unwrap_or(false); let carry: Vec<(u8, crate::campaign::Carry)> = if resume { v.get("carry").cloned().and_then(|c| serde_json::from_value(c).ok()).unwrap_or_default() } else { Vec::new() }; - self.start = Some(StartInfo { seed, map_w, map_h, difficulty, sides, local_side, mission, ai, doc, editor, teams, next: resume, carry }); + let surface = v.get("surface").and_then(|x| x.as_bool()).unwrap_or(false); + self.start = Some(StartInfo { seed, map_w, map_h, difficulty, sides, local_side, mission, ai, doc, editor, teams, next: resume, carry, surface }); self.error = None; self.status = None; } @@ -581,7 +595,7 @@ impl MatchClient { } r.ai = ai.clone(); } - self.start = Some(StartInfo { seed, map_w, map_h, difficulty, sides, local_side, mission: Some(mission), ai, doc: Some(doc), editor: true, teams, next: true, carry }); + self.start = Some(StartInfo { seed, map_w, map_h, difficulty, sides, local_side, mission: Some(mission), ai, doc: Some(doc), editor: true, teams, next: true, carry, surface: false }); self.error = None; } diff --git a/src/main.rs b/src/main.rs index 0090229..7e7461f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -349,7 +349,7 @@ fn account_action(a: MenuAction, cloud: &mut Cloud, menu: &mut Menu, app: &mut A } } MenuAction::MatchJoin(code) => app.client.join(&code), - MenuAction::MatchCreate => app.client.create(&[0, 2, 3, 4], app.settings.map_w, app.settings.map_h, app.settings.difficulty), + MenuAction::MatchCreate => app.client.create_land(&[0, 2, 3, 4], app.settings.map_w, app.settings.map_h, app.settings.difficulty, app.settings.surface), MenuAction::MatchCoopCreate(mission) => { let all = campaign::missions(); if let Some(d) = all.get(mission) { @@ -692,7 +692,7 @@ impl App { let next = run_seed.is_some(); let seed = run_seed.unwrap_or_else(|| next_seed(self.seed)); let editor = doc.is_some(); - let info = StartInfo { seed, map_w, map_h, difficulty: self.settings.difficulty, sides: vec![0, 2], local_side: Some(0), mission: Some(mission), ai: vec![2], doc, editor, teams: Vec::new(), next, carry }; + let info = StartInfo { seed, map_w, map_h, difficulty: self.settings.difficulty, sides: vec![0, 2], local_side: Some(0), mission: Some(mission), ai: vec![2], doc, editor, teams: Vec::new(), next, carry, surface: false }; if !self.start_match_game(info) { return false; } @@ -772,6 +772,10 @@ impl App { if !self.game.start_match(&info.sides, local) { return false; } + if info.surface { + // the same land on every client: built from the shared seed + self.game.add_surface(info.seed, 0.5, 2 + (info.map_h / 64) as u32); + } self.game.coop = false; self.game.set_teams(&info.teams); self.game.ai_difficulty = info.difficulty; diff --git a/src/surface.rs b/src/surface.rs index 0832a96..0525a77 100644 --- a/src/surface.rs +++ b/src/surface.rs @@ -183,4 +183,16 @@ mod tests { } } } + + #[test] + fn the_finale_is_fought_above_ground() { + let g = crate::campaign::start_mission(29, None); + assert!(g.surface_share() > 0.3, "share {}", g.surface_share()); + assert_eq!(g.rivals.len(), 2); + assert!(g.gate_hp > 0.0 && g.has_gate()); + let (gx, gy) = g.map.gate; + assert!(g.map.sky(idx(gx + 1, gy + 1)), "the gate of the order stands in the forest"); + // the heroes find their way from the gate to the core + assert!(g.map.hero_path_to_core(idx(gx + 1, gy + 1)).is_some()); + } }