From 160935bf40de0014102c19d9800ec9d2ea003f73 Mon Sep 17 00:00:00 2001 From: Richard Zink Date: Fri, 6 Nov 2026 00:37:25 +0100 Subject: [PATCH] Tutorial: Crookfinger leads a new master through the first steps Co-Authored-By: Claude Opus 5.5 --- README.md | 2 + docs/ROADMAP.md | 6 ++- lang/cs.lang | 20 ++++++++ lang/da.lang | 20 ++++++++ lang/de.lang | 20 ++++++++ lang/el.lang | 20 ++++++++ lang/en.lang | 20 ++++++++ lang/es.lang | 20 ++++++++ lang/fi.lang | 20 ++++++++ lang/hr.lang | 20 ++++++++ lang/hu.lang | 20 ++++++++ lang/it.lang | 20 ++++++++ lang/nl.lang | 20 ++++++++ lang/no.lang | 20 ++++++++ lang/pt.lang | 20 ++++++++ lang/ro.lang | 20 ++++++++ lang/ru.lang | 20 ++++++++ lang/sk.lang | 20 ++++++++ lang/sr.lang | 20 ++++++++ lang/sv.lang | 20 ++++++++ src/editor/templates.rs | 101 ++++++++++++++++++++++++++++++++++++++++ src/main.rs | 31 +++++++++++- src/menu.rs | 4 ++ 23 files changed, 501 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e133012..74f427f 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,8 @@ After every game a chart shows how it went, and 64 achievements wait - some of t (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. +**🎓 New down here?** The *Tutorial* in the title menu: Crookfinger shows you the ropes, one step at a time. + **📜 A campaign of thirty missions.** Take back the shards of your soul core - from the first little outpost by the border brook to the citadel of Grand Master Valerian Brightshield. Rivers, fortresses, treasure islands, sealed caves, rival masters, and me, telling you the story. With tea. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index e47d0f6..a693246 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -65,7 +65,7 @@ surface songs, so the older pieces stay byte for byte the same): build16-19, bat surface_battle1-2; `audio::Category::Surface` / `SurfaceBattle`, chosen in `MusicDirector` when most of the camera's surroundings lie above ground (4 s crossfade). -## 4. Additions +## 4. Additions – done (v202611-00047) Status: creature abilities (personality.rs: an ability per creature at level 3-7, used by itself) and creature relationships (likes, hates, brawls) existed already. Done in this block so far: @@ -84,7 +84,9 @@ wood or a mana potion), seasons (snow above ground in winter, pumpkins at Hallow creature equipment (`src/armory.rs`: without orders the forge makes iron, steel and rune gear for gold; each piece goes to the strongest creature without one that good: +10/22/38% health and attack, a coloured mark at the health bar). The dynamic music (calm and battle) existed already and now also follows the camera to the -surface. Still open: the tutorial mission. +surface. The tutorial (*Tutorial* in the title menu, `editor::templates::tutorial_campaign`): Crookfinger leads a +new master through digging, claiming, lair, mushroom garden, the first creatures, a slap and two knights - one +painted mission whose triggers switch each other on. **Block 4 is done.** 1. **Random events** – earthquake (tunnels cave in), lava eruption, flood, gold vein found. Rare (every 8–12 minutes), free play and multiplayer only, can be switched off in the menu; in diff --git a/lang/cs.lang b/lang/cs.lang index c2d1687..8ce116b 100644 --- a/lang/cs.lang +++ b/lang/cs.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Zde jsou draci ach.wyrm.desc = Žhavý drak se přidá k tvé kobce. ach.fullhand.name = Plné ruce práce ach.fullhand.desc = Drž v ruce najednou osm jednotek. + +# tutorial +menu.tutorial = Úvod +tut.name = První kroky +tut.title = Křivoprst ti ukáže, jak se to dělá +tut.story = Tak ty jsi ten nový pán. Malý, ale jádro ještě bije, a to je hlavní.\n\nUkážu ti základy: kopání, místnosti, tvory a co dělat s rytíři. Dělej, co říkám, a nikomu se nic nestane. Kromě rytířů. +tut.start = Křivoprst: První lekce - kopání. Vezmi nástroj Kopat (klávesa 1), táhni přes zeminu východně od srdce a tvoji čertíci ji vykopou. +tut.obj1 = Vykopej tunel východně od srdce. +tut.dug = Křivoprst: Hle, za ní je síň! Tvoji čertíci si půdu zaberou sami. Teď otevři Místnosti a postav doupě na vlastní podlaze - tam spí tvoji tvorové. +tut.obj2 = Postav doupě (Místnosti). +tut.lair = Křivoprst: Postele, hotovo. Tvorové taky jedí: postav vedle houbovou zahradu. +tut.obj3 = Postav houbovou zahradu (Místnosti). +tut.farm = Křivoprst: Strava a nocleh - teď ti portál posílá tvory. Trpělivost, přijdou sami. Počkej na dva. +tut.obj4 = Počkej, až portálem projdou dva tvorové. +tut.creatures = Křivoprst: Tady jsou! Trocha motivace nikdy neuškodí: vezmi ruku (klávesa 2) a klikni na tvora s podrženým Shiftem (na dotykové obrazovce: klepni na něj dvakrát), abys mu dal pohlavek. Chvíli bude pracovat rychleji. +tut.obj5 = Dej pohlavek jednomu ze svých tvorů (ruka, Shift + klik). +tut.slap = Křivoprst: Ha! Slyšel jsi to? Něco přichází od východu. Připrav se: blesk (Kouzla) udeří tvrdě a tvoji tvorové bojují sami. +tut.obj6 = Poraz dva rytíře. +tut.knights = Křivoprst: Dva rytíři! Pošli na ně tvory útočnou vlajkou (Rozkazy) nebo je zasáhni bleskem. +tut.win = Křivoprst: Výborně, pane! To je všechno. No - skoro. Zbytek poví kampaň. Přistavím vodu na čaj. diff --git a/lang/da.lang b/lang/da.lang index 9805d97..71e53ae 100644 --- a/lang/da.lang +++ b/lang/da.lang @@ -1642,3 +1642,23 @@ ach.wyrm.name = Her Er Drager ach.wyrm.desc = En glødelindorm slutter sig til dit dungeon. ach.fullhand.name = Hænderne Fulde ach.fullhand.desc = Hold otte enheder i hånden på én gang. + +# tutorial +menu.tutorial = Introduktion +tut.name = Første skridt +tut.title = Krumfinger viser dig, hvordan det gøres +tut.story = Så du er den nye mester. Lille, men kernen slår stadig, og det er det, der tæller.\n\nJeg viser dig det vigtigste: gravning, rum, væsner og hvad man gør med riddere. Gør som jeg siger, så kommer ingen til skade. Undtagen ridderne. +tut.start = Krumfinger: Første lektion: gravning. Tag hakken (tast 1), træk hen over jorden øst for hjertet, så graver dine imps den ud. +tut.obj1 = Grav gangen øst for hjertet ud. +tut.dug = Krumfinger: Se der, en hal bagved! Dine imps gør selv krav på gulvet. Åbn nu Rum og byg et hi på dit eget gulv: der sover dine væsner. +tut.obj2 = Byg et hi (Rum). +tut.lair = Krumfinger: Senge, klaret. Væsner spiser også: byg en svampehave ved siden af. +tut.obj3 = Byg en svampehave (Rum). +tut.farm = Krumfinger: Kost og logi: nu sender portalen dig væsner. Tålmodighed, de kommer af sig selv. Vent på to. +tut.obj4 = Vent, til to væsner er kommet gennem portalen. +tut.creatures = Krumfinger: Der er de! Lidt motivation skader aldrig: tag hånden (tast 2) og klik på et væsen med Shift holdt nede (på en berøringsskærm: tryk to gange) for at give det en lussing. Så arbejder det hurtigere et stykke tid. +tut.obj5 = Giv et af dine væsner en lussing (hånd, Shift + klik). +tut.slap = Krumfinger: Ha! Hørte du det? Noget kommer fra øst. Gør dig klar: lynet (Besværgelser) rammer hårdt, og dine væsner kæmper af sig selv. +tut.obj6 = Besejr de to riddere. +tut.knights = Krumfinger: To riddere! Send dine væsner af sted med angrebsflaget (Ordrer), eller ram dem med lynet. +tut.win = Krumfinger: Godt gået, mester! Det er alt, hvad der skal til. Altså – næsten. Kampagnen fortæller resten. Jeg sætter kedlen over. diff --git a/lang/de.lang b/lang/de.lang index 59b32af..ab0e6f4 100644 --- a/lang/de.lang +++ b/lang/de.lang @@ -1642,3 +1642,23 @@ ach.wyrm.name = Hier seien Drachen ach.wyrm.desc = Ein Glutwurm schließt sich deinem Kerker an. ach.fullhand.name = Alle Hände voll ach.fullhand.desc = Halte acht Einheiten gleichzeitig in der Hand. + +# tutorial +menu.tutorial = Einführung +tut.name = Erste Schritte +tut.title = Crookfinger zeigt dir, wie es geht +tut.story = Du bist also der neue Meister. Klein, aber der Kern schlägt noch, und das zählt.\n\nIch zeige dir das Wichtigste: Graben, Räume, Kreaturen und was man mit Rittern macht. Tu, was ich sage, und niemandem passiert etwas. Außer den Rittern. +tut.start = Crookfinger: Erste Lektion – Graben. Nimm die Spitzhacke (Taste 1), zieh über die Erde östlich des Herzens, und deine Imps graben sie aus. +tut.obj1 = Grabe den Gang östlich des Herzens aus. +tut.dug = Crookfinger: Sieh an, eine Halle dahinter! Deine Imps beanspruchen den Boden von selbst. Öffne jetzt Räume und baue ein Lager auf deinem Boden – dort schlafen deine Kreaturen. +tut.obj2 = Baue ein Lager (Räume). +tut.lair = Crookfinger: Betten, erledigt. Kreaturen essen auch: Baue daneben einen Pilzgarten. +tut.obj3 = Baue einen Pilzgarten (Räume). +tut.farm = Crookfinger: Kost und Logis – jetzt schickt dir das Portal Kreaturen. Geduld, sie kommen von selbst. Warte auf zwei. +tut.obj4 = Warte, bis zwei Kreaturen durchs Portal gekommen sind. +tut.creatures = Crookfinger: Da sind sie! Ein wenig Ansporn schadet nie: Nimm die Hand (Taste 2) und klick eine Kreatur mit gedrückter Umschalttaste an (am Touchscreen: zweimal antippen), um ihr einen Klaps zu geben. Eine Weile arbeitet sie schneller. +tut.obj5 = Gib einer deiner Kreaturen einen Klaps (Hand, Umschalt + Klick). +tut.slap = Crookfinger: Ha! Hast du das gehört? Aus dem Osten kommt etwas. Mach dich bereit: Der Blitz (Zauber) trifft hart, und deine Kreaturen kämpfen von selbst. +tut.obj6 = Besiege die beiden Ritter. +tut.knights = Crookfinger: Zwei Ritter! Schick deine Kreaturen mit der Angriffsflagge (Befehle) oder triff sie mit dem Blitz. +tut.win = Crookfinger: Gut gemacht, Meister! Mehr ist es nicht. Na ja – fast. Den Rest erzählt die Kampagne. Ich setze Wasser auf. diff --git a/lang/el.lang b/lang/el.lang index 1bacb64..ce18668 100644 --- a/lang/el.lang +++ b/lang/el.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Εδώ υπάρχουν δράκοι ach.wyrm.desc = Ένας δράκος της θράκας μπαίνει στο μπουντρούμι σου. ach.fullhand.name = Γεμάτα χέρια ach.fullhand.desc = Κράτα οκτώ μονάδες στο χέρι σου ταυτόχρονα. + +# tutorial +menu.tutorial = Εκμάθηση +tut.name = Πρώτα βήματα +tut.title = Ο Στραβοδάχτυλος σού δείχνει τα κόλπα +tut.story = Ώστε εσύ είσαι ο νέος αφέντης. Μικρός, αλλά ο πυρήνας ακόμα χτυπά, και αυτό μετράει.\n\nΘα σου δείξω τα βασικά: σκάψιμο, δωμάτια, πλάσματα και τι να κάνεις με τους ιππότες. Κάνε ό,τι σου λέω και κανείς δεν θα πάθει τίποτα. Εκτός από τους ιππότες. +tut.start = Στραβοδάχτυλος: Πρώτο μάθημα - σκάψιμο. Πάρε το εργαλείο Σκάψε (πλήκτρο 1), σύρε πάνω από το χώμα ανατολικά της καρδιάς και τα δαιμονάκια σου θα το σκάψουν. +tut.obj1 = Σκάψε το τούνελ ανατολικά της καρδιάς. +tut.dug = Στραβοδάχτυλος: Ορίστε, μια αίθουσα από πίσω! Τα δαιμονάκια σου κατακτούν το έδαφος μόνα τους. Τώρα άνοιξε τα Δωμάτια και χτίσε μια φωλιά στο δικό σου δάπεδο - εκεί κοιμούνται τα πλάσματά σου. +tut.obj2 = Χτίσε μια φωλιά (Δωμάτια). +tut.lair = Στραβοδάχτυλος: Κρεβάτια, έτοιμα. Τα πλάσματα και τρώνε: χτίσε έναν μανιταρόκηπο δίπλα. +tut.obj3 = Χτίσε έναν μανιταρόκηπο (Δωμάτια). +tut.farm = Στραβοδάχτυλος: Στέγη και τροφή - τώρα η πύλη μετάβασης σού στέλνει πλάσματα. Υπομονή, έρχονται μόνα τους. Περίμενε δύο. +tut.obj4 = Περίμενε μέχρι να περάσουν δύο πλάσματα από την πύλη μετάβασης. +tut.creatures = Στραβοδάχτυλος: Να τα! Λίγο κίνητρο δεν βλάπτει ποτέ: πάρε το χέρι (πλήκτρο 2) και κάνε κλικ σε ένα πλάσμα κρατώντας πατημένο το Shift (σε οθόνη αφής: πάτησέ το δύο φορές) για να το χαστουκίσεις. Για λίγο δουλεύει πιο γρήγορα. +tut.obj5 = Χαστούκισε ένα από τα πλάσματά σου (χέρι, Shift + κλικ). +tut.slap = Στραβοδάχτυλος: Χα! Το άκουσες; Κάτι έρχεται από την ανατολή. Ετοιμάσου: ο κεραυνός (Ξόρκια) χτυπά δυνατά, και τα πλάσματά σου πολεμούν μόνα τους. +tut.obj6 = Νίκησε τους δύο ιππότες. +tut.knights = Στραβοδάχτυλος: Δύο ιππότες! Στείλε τα πλάσματά σου με τη σημαία επίθεσης (Εντολές) ή χτύπησέ τους με κεραυνό. +tut.win = Στραβοδάχτυλος: Μπράβο, αφέντη! Αυτό ήταν όλο. Ε - σχεδόν. Τα υπόλοιπα θα τα πει η εκστρατεία. Βάζω νερό για τσάι. diff --git a/lang/en.lang b/lang/en.lang index e164f59..b069a22 100644 --- a/lang/en.lang +++ b/lang/en.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Here Be Dragons ach.wyrm.desc = An ember wyrm joins your dungeon. ach.fullhand.name = Hands Full ach.fullhand.desc = Hold eight units in your hand at once. + +# tutorial +menu.tutorial = Tutorial +tut.name = First Steps +tut.title = Crookfinger Shows You the Ropes +tut.story = So you are the new master. Small, but the core still beats, and that is what counts.\n\nI will show you the basics: digging, rooms, creatures, and what to do with knights. Do what I say, and nobody gets hurt. Except the knights. +tut.start = Crookfinger: First lesson - digging. Take the pick (key 1), drag over the earth east of the heart and your imps dig it out. +tut.obj1 = Dig out the tunnel east of the heart. +tut.dug = Crookfinger: There, a hall behind it! Your imps claim the ground by themselves. Now open Rooms and build a lair on your own floor - your creatures sleep there. +tut.obj2 = Build a lair (Rooms). +tut.lair = Crookfinger: Beds, check. Creatures also eat: build a mushroom garden next to it. +tut.obj3 = Build a mushroom garden (Rooms). +tut.farm = Crookfinger: Bed and board - now the portal sends you creatures. Be patient, they come by themselves. Wait for two. +tut.obj4 = Wait until two creatures have come through the portal. +tut.creatures = Crookfinger: Here they are! A little motivation never hurts: take the hand (key 2) and click a creature with Shift held down (on a touch screen: tap it twice) to slap it. It works faster for a while. +tut.obj5 = Slap one of your creatures (hand, Shift + click). +tut.slap = Crookfinger: Ha! Did you hear that? Something is coming from the east. Get ready: lightning (Spells) hits hard, and your creatures fight on their own. +tut.obj6 = Defeat the two knights. +tut.knights = Crookfinger: Two knights! Send your creatures with the attack flag (Orders) or strike them with lightning. +tut.win = Crookfinger: Well done, master! That is all there is to it. Well - almost. The campaign tells the rest. I'll put the kettle on. diff --git a/lang/es.lang b/lang/es.lang index 033ee48..cc9b2d6 100644 --- a/lang/es.lang +++ b/lang/es.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Aquí hay dragones ach.wyrm.desc = Un dragón de brasas se une a tu mazmorra. ach.fullhand.name = Manos llenas ach.fullhand.desc = Sostén ocho unidades en la mano a la vez. + +# tutorial +menu.tutorial = Tutorial +tut.name = Primeros pasos +tut.title = Dedotuerto te enseña el oficio +tut.story = Así que tú eres el nuevo amo. Pequeño, pero el núcleo aún late, y eso es lo que cuenta.\n\nTe enseñaré lo básico: excavar, salas, criaturas y qué hacer con los caballeros. Haz lo que te digo y nadie saldrá herido. Salvo los caballeros. +tut.start = Dedotuerto: Primera lección: excavar. Coge el pico (tecla 1), arrastra sobre la tierra al este del corazón y tus diablillos la excavarán. +tut.obj1 = Excava el túnel al este del corazón. +tut.dug = Dedotuerto: ¡Mira, una sala detrás! Tus diablillos reclaman el suelo por sí solos. Ahora abre Salas y construye una guarida en tu propio suelo: ahí duermen tus criaturas. +tut.obj2 = Construye una guarida (Salas). +tut.lair = Dedotuerto: Camas, hecho. Las criaturas también comen: construye un huerto de setas al lado. +tut.obj3 = Construye un huerto de setas (Salas). +tut.farm = Dedotuerto: Cama y comida: ahora el portal te envía criaturas. Paciencia, vienen solas. Espera a dos. +tut.obj4 = Espera a que dos criaturas lleguen por el portal. +tut.creatures = Dedotuerto: ¡Aquí están! Un poco de motivación nunca viene mal: coge la mano (tecla 2) y haz clic en una criatura manteniendo Mayús pulsada (en pantalla táctil: tócala dos veces) para darle un bofetón. Trabajará más rápido durante un rato. +tut.obj5 = Dale un bofetón a una de tus criaturas (mano, Mayús + clic). +tut.slap = Dedotuerto: ¡Ja! ¿Lo has oído? Algo viene del este. Prepárate: el rayo (Hechizos) golpea fuerte, y tus criaturas luchan solas. +tut.obj6 = Derrota a los dos caballeros. +tut.knights = Dedotuerto: ¡Dos caballeros! Envía a tus criaturas con la bandera de ataque (Órdenes) o fulmínalos con el rayo. +tut.win = Dedotuerto: ¡Bien hecho, amo! Eso es todo. Bueno, casi. La campaña cuenta el resto. Voy a poner el agua a hervir. diff --git a/lang/fi.lang b/lang/fi.lang index 865303b..4f7faf0 100644 --- a/lang/fi.lang +++ b/lang/fi.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Täällä on lohikäärmeitä ach.wyrm.desc = Hehkulohikäärme liittyy luolastoosi. ach.fullhand.name = Kädet täynnä ach.fullhand.desc = Pidä kahdeksaa yksikköä kädessäsi yhtä aikaa. + +# tutorial +menu.tutorial = Opastus +tut.name = Ensiaskeleet +tut.title = Crookfinger näyttää, miten homma toimii +tut.story = Vai sinä olet se uusi mestari. Pieni, mutta ydin sykkii yhä, ja se on pääasia.\n\nNäytän sinulle perusasiat: kaivamisen, huoneet, olennot ja sen, mitä ritareille tehdään. Tee kuten sanon, niin kenellekään ei käy kuinkaan. Paitsi ritareille. +tut.start = Crookfinger: Ensimmäinen oppitunti - kaivaminen. Ota Kaiva-työkalu (näppäin 1), vedä sydämen itäpuolella olevan maan yli, niin pirusi kaivavat sen auki. +tut.obj1 = Kaiva tunneli auki sydämen itäpuolelle. +tut.dug = Crookfinger: Kas, sen takana on halli! Pirusi valtaavat maan itsestään. Avaa nyt Huoneet ja rakenna pesä omalle lattiallesi - olentosi nukkuvat siellä. +tut.obj2 = Rakenna pesä (Huoneet). +tut.lair = Crookfinger: Sängyt, valmis. Olennot myös syövät: rakenna sienitarha viereen. +tut.obj3 = Rakenna sienitarha (Huoneet). +tut.farm = Crookfinger: Täysihoito - nyt portaali lähettää sinulle olentoja. Kärsivällisyyttä, ne tulevat itsestään. Odota kahta. +tut.obj4 = Odota, kunnes kaksi olentoa on tullut portaalin läpi. +tut.creatures = Crookfinger: Siinä ne ovat! Pieni motivointi ei koskaan haittaa: ota käsi (näppäin 2) ja napsauta olentoa Shift pohjassa (kosketusnäytöllä: napauta sitä kahdesti) läimäyttääksesi sitä. Se työskentelee hetken nopeammin. +tut.obj5 = Läimäytä yhtä olennoistasi (käsi, Shift + napsautus). +tut.slap = Crookfinger: Ha! Kuulitko? Idästä tulee jotain. Valmistaudu: salama (Loitsut) iskee kovaa, ja olentosi taistelevat omin päin. +tut.obj6 = Kukista kaksi ritaria. +tut.knights = Crookfinger: Kaksi ritaria! Lähetä olentosi hyökkäyslipulla (Käskyt) tai iske heitä salamalla. +tut.win = Crookfinger: Hyvin tehty, mestari! Siinä kaikki. No - melkein. Kampanja kertoo loput. Panen teeveden kiehumaan. diff --git a/lang/hr.lang b/lang/hr.lang index 4d9245a..92def4e 100644 --- a/lang/hr.lang +++ b/lang/hr.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Ovdje su zmajevi ach.wyrm.desc = Žarni zmaj pridružuje se tvojoj tamnici. ach.fullhand.name = Pune ruke posla ach.fullhand.desc = Drži osam jedinica u ruci odjednom. + +# tutorial +menu.tutorial = Uvod +tut.name = Prvi koraci +tut.title = Krivoprst ti pokazuje kako se to radi +tut.story = Dakle, ti si novi gospodar. Malen, ali jezgra još kuca, a to je ono što se računa.\n\nPokazat ću ti osnove: kopanje, sobe, stvorenja i što učiniti s vitezovima. Radi što kažem i nitko neće stradati. Osim vitezova. +tut.start = Krivoprst: Prva lekcija - kopanje. Uzmi alat za kopanje (tipka 1), povuci preko zemlje istočno od srca i tvoji vražići će je iskopati. +tut.obj1 = Iskopaj tunel istočno od srca. +tut.dug = Krivoprst: Eto, iza je dvorana! Tvoji vražići sami osvajaju tlo. Sad otvori Sobe i izgradi brlog na svom podu - tamo spavaju tvoja stvorenja. +tut.obj2 = Izgradi brlog (Sobe). +tut.lair = Krivoprst: Kreveti, gotovo. Stvorenja i jedu: izgradi vrt gljiva odmah do njega. +tut.obj3 = Izgradi vrt gljiva (Sobe). +tut.farm = Krivoprst: Stan i hrana - sad ti portal šalje stvorenja. Strpljenja, dolaze sama. Pričekaj dva. +tut.obj4 = Pričekaj da kroz portal dođu dva stvorenja. +tut.creatures = Krivoprst: Evo ih! Malo motivacije nikad ne škodi: uzmi ruku (tipka 2) i klikni stvorenje držeći Shift (na zaslonu osjetljivom na dodir: dodirni ga dvaput) da ga pljusneš. Neko vrijeme radi brže. +tut.obj5 = Pljusni jedno od svojih stvorenja (ruka, Shift + klik). +tut.slap = Krivoprst: Ha! Jesi li čuo? Nešto dolazi s istoka. Pripremi se: munja (Čarolije) snažno udara, a tvoja se stvorenja bore sama. +tut.obj6 = Porazi dva viteza. +tut.knights = Krivoprst: Dva viteza! Pošalji stvorenja zastavom napada (Naredbe) ili ih udari munjom. +tut.win = Krivoprst: Bravo, gospodaru! To je sve. Pa - skoro. Ostatak će ispričati kampanja. Idem staviti vodu za čaj. diff --git a/lang/hu.lang b/lang/hu.lang index c0aa45d..80ca308 100644 --- a/lang/hu.lang +++ b/lang/hu.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Itt sárkányok laknak ach.wyrm.desc = Egy parázssárkány csatlakozik a kazamatádhoz. ach.fullhand.name = Tele a kéz ach.fullhand.desc = Tarts egyszerre nyolc egységet a kezedben. + +# tutorial +menu.tutorial = Bevezető +tut.name = Első lépések +tut.title = Crookfinger beavat a fortélyokba +tut.story = Szóval te vagy az új mester. Kicsi, de a mag még dobog, és ez a lényeg.\n\nMegmutatom az alapokat: ásás, szobák, lények, és hogy mit kezdj a lovagokkal. Tedd, amit mondok, és senkinek nem esik baja. Kivéve a lovagokat. +tut.start = Crookfinger: Első lecke - ásás. Fogd az Ásás eszközt (1-es billentyű), húzd végig a szívtől keletre lévő földön, és a manóid kiássák. +tut.obj1 = Ásd ki a szívtől keletre lévő alagutat. +tut.dug = Crookfinger: Na tessék, mögötte egy csarnok! A manóid maguktól elfoglalják a talajt. Most nyisd meg a Szobákat, és építs odút a saját padlódra - ott alszanak a lényeid. +tut.obj2 = Építs odút (Szobák). +tut.lair = Crookfinger: Ágyak, pipa. A lények esznek is: építs mellé gombakertet. +tut.obj3 = Építs gombakertet (Szobák). +tut.farm = Crookfinger: Ágy és koszt - most a portál lényeket küld neked. Türelem, maguktól jönnek. Várj kettőre. +tut.obj4 = Várd meg, amíg két lény átjön a portálon. +tut.creatures = Crookfinger: Itt is vannak! Egy kis motiváció sosem árt: fogd a kezet (2-es billentyű), és a Shiftet lenyomva tartva kattints egy lényre (érintőképernyőn: koppints rá kétszer), hogy felpofozd. Egy ideig gyorsabban dolgozik. +tut.obj5 = Pofozd fel az egyik lényedet (kéz, Shift + kattintás). +tut.slap = Crookfinger: Ha! Hallottad? Valami jön keletről. Készülj: a villám (Varázs) nagyot üt, és a lényeid maguktól harcolnak. +tut.obj6 = Győzd le a két lovagot. +tut.knights = Crookfinger: Két lovag! Küldd rájuk a lényeidet a támadózászlóval (Parancs), vagy sújtsd őket villámmal. +tut.win = Crookfinger: Szép munka, mester! Ennyi az egész. Nos - majdnem. A többit elmondja a hadjárat. Felteszem a teavizet. diff --git a/lang/it.lang b/lang/it.lang index 614f831..fd74f93 100644 --- a/lang/it.lang +++ b/lang/it.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Hic sunt dracones ach.wyrm.desc = Un drago di brace si unisce al tuo dungeon. ach.fullhand.name = Mani piene ach.fullhand.desc = Tieni in mano otto unità contemporaneamente. + +# tutorial +menu.tutorial = Tutorial +tut.name = Primi passi +tut.title = Ditastorte ti insegna il mestiere +tut.story = Dunque sei tu il nuovo padrone. Piccolo, ma il nucleo batte ancora, ed è questo che conta.\n\nTi mostrerò le basi: scavare, stanze, creature e cosa fare con i cavalieri. Fai quello che dico e nessuno si farà male. Tranne i cavalieri. +tut.start = Ditastorte: Prima lezione: scavare. Prendi il piccone (tasto 1), trascina sulla terra a est del cuore e i tuoi imp la scaveranno. +tut.obj1 = Scava il tunnel a est del cuore. +tut.dug = Ditastorte: Guarda, c'è una sala dietro! I tuoi imp reclamano il suolo da soli. Ora apri Stanze e costruisci una tana sul tuo pavimento: lì dormono le tue creature. +tut.obj2 = Costruisci una tana (Stanze). +tut.lair = Ditastorte: Letti, fatto. Anche le creature mangiano: costruisci una fungaia lì accanto. +tut.obj3 = Costruisci una fungaia (Stanze). +tut.farm = Ditastorte: Vitto e alloggio: ora il portale ti manda creature. Pazienza, arrivano da sole. Aspettane due. +tut.obj4 = Aspetta che due creature arrivino dal portale. +tut.creatures = Ditastorte: Eccole! Un po' di incoraggiamento non guasta mai: prendi la mano (tasto 2) e clicca su una creatura tenendo premuto Shift (su touch screen: toccala due volte) per darle uno schiaffo. Per un po' lavorerà più in fretta. +tut.obj5 = Dai uno schiaffo a una delle tue creature (mano, Shift + clic). +tut.slap = Ditastorte: Ah! Hai sentito? Qualcosa arriva da est. Preparati: il fulmine (Magie) colpisce duro, e le tue creature combattono da sole. +tut.obj6 = Sconfiggi i due cavalieri. +tut.knights = Ditastorte: Due cavalieri! Manda le tue creature con la bandiera d'attacco (Ordini) o colpiscili con il fulmine. +tut.win = Ditastorte: Ben fatto, padrone! Tutto qui. Be', quasi. Il resto lo racconta la campagna. Metto su il bollitore. diff --git a/lang/nl.lang b/lang/nl.lang index cb00928..b501a41 100644 --- a/lang/nl.lang +++ b/lang/nl.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Hier Zijn Draken ach.wyrm.desc = Een gloeddraak sluit zich aan bij je kerker. ach.fullhand.name = Handen Vol ach.fullhand.desc = Houd acht units tegelijk in je hand. + +# tutorial +menu.tutorial = Tutorial +tut.name = Eerste stappen +tut.title = Krommevinger wijst je de weg +tut.story = Dus jij bent de nieuwe meester. Klein, maar de kern klopt nog, en dat telt.\n\nIk laat je de basis zien: graven, kamers, wezens en wat je met ridders doet. Doe wat ik zeg en niemand raakt gewond. Behalve de ridders. +tut.start = Krommevinger: Eerste les: graven. Pak het houweel (toets 1), sleep over de aarde ten oosten van het hart en je imps graven het uit. +tut.obj1 = Graaf de gang ten oosten van het hart uit. +tut.dug = Krommevinger: Kijk eens, een hal erachter! Je imps nemen de grond vanzelf in. Open nu Kamers en bouw een hol op je eigen vloer: daar slapen je wezens. +tut.obj2 = Bouw een hol (Kamers). +tut.lair = Krommevinger: Bedden, check. Wezens eten ook: bouw er een paddenstoeltuin naast. +tut.obj3 = Bouw een paddenstoeltuin (Kamers). +tut.farm = Krommevinger: Kost en inwoning: nu stuurt het portaal je wezens. Geduld, ze komen vanzelf. Wacht op twee. +tut.obj4 = Wacht tot er twee wezens door het portaal zijn gekomen. +tut.creatures = Krommevinger: Daar zijn ze! Een beetje motivatie kan nooit kwaad: pak de hand (toets 2) en klik met ingedrukte Shift op een wezen (op een touchscreen: tik er twee keer op) om het een mep te geven. Het werkt dan een tijdje sneller. +tut.obj5 = Geef een van je wezens een mep (hand, Shift + klik). +tut.slap = Krommevinger: Ha! Hoorde je dat? Er komt iets uit het oosten. Maak je klaar: de bliksem (Spreuken) slaat hard toe, en je wezens vechten vanzelf. +tut.obj6 = Versla de twee ridders. +tut.knights = Krommevinger: Twee ridders! Stuur je wezens met de aanvalsvlag (Bevelen) of tref ze met de bliksem. +tut.win = Krommevinger: Goed gedaan, meester! Meer is het niet. Nou ja, bijna. De veldtocht vertelt de rest. Ik zet water op. diff --git a/lang/no.lang b/lang/no.lang index d5d94a9..0ddd918 100644 --- a/lang/no.lang +++ b/lang/no.lang @@ -1642,3 +1642,23 @@ ach.wyrm.name = Her Være Drager ach.wyrm.desc = En glødlindorm slutter seg til dungeonet ditt. ach.fullhand.name = Hendene Fulle ach.fullhand.desc = Hold åtte enheter i hånden samtidig. + +# tutorial +menu.tutorial = Opplæring +tut.name = Første skritt +tut.title = Krokfinger viser deg hvordan det gjøres +tut.story = Så du er den nye mesteren. Liten, men kjernen slår fortsatt, og det er det som teller.\n\nJeg skal vise deg det viktigste: graving, rom, skapninger og hva man gjør med riddere. Gjør som jeg sier, så blir ingen skadet. Bortsett fra ridderne. +tut.start = Krokfinger: Første leksjon: graving. Ta hakka (tast 1), dra over jorda øst for hjertet, så graver impene dine den ut. +tut.obj1 = Grav ut gangen øst for hjertet. +tut.dug = Krokfinger: Se der, en hall bak! Impene dine tar gulvet av seg selv. Åpne nå Rom og bygg et hi på ditt eget gulv: der sover skapningene dine. +tut.obj2 = Bygg et hi (Rom). +tut.lair = Krokfinger: Senger, klart. Skapninger spiser også: bygg en soppehage ved siden av. +tut.obj3 = Bygg en soppehage (Rom). +tut.farm = Krokfinger: Kost og losji: nå sender portalen deg skapninger. Tålmodighet, de kommer av seg selv. Vent på to. +tut.obj4 = Vent til to skapninger har kommet gjennom portalen. +tut.creatures = Krokfinger: Der er de! Litt motivasjon skader aldri: ta hånden (tast 2) og klikk på en skapning mens du holder Shift nede (på berøringsskjerm: trykk to ganger) for å gi den en ørefik. Da jobber den fortere en stund. +tut.obj5 = Gi en av skapningene dine en ørefik (hånd, Shift + klikk). +tut.slap = Krokfinger: Ha! Hørte du det? Noe kommer fra øst. Gjør deg klar: lynet (Formler) slår hardt, og skapningene dine kjemper av seg selv. +tut.obj6 = Beseir de to ridderne. +tut.knights = Krokfinger: To riddere! Send skapningene dine med angrepsflagget (Ordrer), eller slå dem med lynet. +tut.win = Krokfinger: Godt gjort, mester! Det var det hele. Vel – nesten. Kampanjen forteller resten. Jeg setter på kjelen. diff --git a/lang/pt.lang b/lang/pt.lang index 4d2a5f7..8df3ead 100644 --- a/lang/pt.lang +++ b/lang/pt.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Aqui Há Dragões ach.wyrm.desc = Uma serpe de brasa junta-se à tua masmorra. ach.fullhand.name = Mãos Cheias ach.fullhand.desc = Segura oito unidades na mão ao mesmo tempo. + +# tutorial +menu.tutorial = Tutorial +tut.name = Primeiros Passos +tut.title = Dedotorto Ensina-te o Ofício +tut.story = Então tu és o novo mestre. Pequeno, mas o núcleo ainda bate, e é isso que conta.\n\nVou mostrar-te o básico: cavar, salas, criaturas e o que fazer com cavaleiros. Faz o que eu digo e ninguém se magoa. Exceto os cavaleiros. +tut.start = Dedotorto: Primeira lição: cavar. Pega na picareta (tecla 1), arrasta sobre a terra a leste do coração e os teus diabretes escavam-na. +tut.obj1 = Escava o túnel a leste do coração. +tut.dug = Dedotorto: Olha, um salão lá atrás! Os teus diabretes reclamam o chão sozinhos. Agora abre Salas e constrói um covil no teu chão: é lá que as tuas criaturas dormem. +tut.obj2 = Constrói um covil (Salas). +tut.lair = Dedotorto: Camas, feito. As criaturas também comem: constrói uma horta de cogumelos ao lado. +tut.obj3 = Constrói uma horta de cogumelos (Salas). +tut.farm = Dedotorto: Cama e mesa: agora o portal envia-te criaturas. Paciência, elas vêm sozinhas. Espera por duas. +tut.obj4 = Espera até duas criaturas chegarem pelo portal. +tut.creatures = Dedotorto: Aqui estão elas! Um pouco de motivação nunca fez mal a ninguém: pega na mão (tecla 2) e clica numa criatura com Shift premido (num ecrã tátil: toca-lhe duas vezes) para lhe dar uma bofetada. Durante algum tempo trabalha mais depressa. +tut.obj5 = Dá uma bofetada a uma das tuas criaturas (mão, Shift + clique). +tut.slap = Dedotorto: Ah! Ouviste aquilo? Vem aí qualquer coisa do leste. Prepara-te: o relâmpago (Feitiços) atinge com força, e as tuas criaturas lutam sozinhas. +tut.obj6 = Derrota os dois cavaleiros. +tut.knights = Dedotorto: Dois cavaleiros! Envia as tuas criaturas com a bandeira de ataque (Ordens) ou atinge-os com o relâmpago. +tut.win = Dedotorto: Muito bem, mestre! É tudo. Bem, quase. A campanha conta o resto. Vou pôr a chaleira ao lume. diff --git a/lang/ro.lang b/lang/ro.lang index 03fd56f..3b435b7 100644 --- a/lang/ro.lang +++ b/lang/ro.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Aici sunt dragoni ach.wyrm.desc = Un balaur de jar se alătură temniței tale. ach.fullhand.name = Mâinile pline ach.fullhand.desc = Ține opt unități în mână deodată. + +# tutorial +menu.tutorial = Tutorial +tut.name = Primii pași +tut.title = Crookfinger îți arată cum stă treaba +tut.story = Deci tu ești noul stăpân. Mic, dar miezul încă bate, și asta contează.\n\nÎți arăt elementele de bază: săpatul, camerele, creaturile și ce să faci cu cavalerii. Fă ce-ți spun și nimeni nu pățește nimic. În afară de cavaleri. +tut.start = Crookfinger: Prima lecție - săpatul. Ia unealta Sapă (tasta 1), trage peste pământul de la est de inimă și drăcușorii tăi îl vor săpa. +tut.obj1 = Sapă tunelul de la est de inimă. +tut.dug = Crookfinger: Uite, o sală în spate! Drăcușorii tăi cuceresc singuri terenul. Acum deschide Camere și construiește un bârlog pe podeaua ta - acolo dorm creaturile tale. +tut.obj2 = Construiește un bârlog (Camere). +tut.lair = Crookfinger: Paturi, bifat. Creaturile și mănâncă: construiește o grădină de ciuperci lângă el. +tut.obj3 = Construiește o grădină de ciuperci (Camere). +tut.farm = Crookfinger: Casă și masă - acum portalul îți trimite creaturi. Răbdare, vin singure. Așteaptă două. +tut.obj4 = Așteaptă până când două creaturi trec prin portal. +tut.creatures = Crookfinger: Iată-le! Puțină motivație nu strică niciodată: ia mâna (tasta 2) și dă clic pe o creatură ținând apăsat Shift (pe ecran tactil: atinge-o de două ori) ca să-i dai o palmă. Va munci mai repede o vreme. +tut.obj5 = Dă-i o palmă uneia dintre creaturile tale (mână, Shift + clic). +tut.slap = Crookfinger: Ha! Ai auzit? Ceva vine dinspre est. Pregătește-te: fulgerul (Vrăji) lovește tare, iar creaturile tale luptă singure. +tut.obj6 = Învinge cei doi cavaleri. +tut.knights = Crookfinger: Doi cavaleri! Trimite-ți creaturile cu steagul de atac (Ordine) sau lovește-i cu fulgerul. +tut.win = Crookfinger: Bravo, stăpâne! Asta e tot. Ei - aproape. Campania îți spune restul. Pun de un ceai. diff --git a/lang/ru.lang b/lang/ru.lang index 5ac8a15..fa4478f 100644 --- a/lang/ru.lang +++ b/lang/ru.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Здесь водятся драконы ach.wyrm.desc = Огненный змий присоединяется к твоему подземелью. ach.fullhand.name = Полные руки ach.fullhand.desc = Держи в руке восемь существ одновременно. + +# tutorial +menu.tutorial = Обучение +tut.name = Первые шаги +tut.title = Кривопал вводит тебя в курс дела +tut.story = Так ты, значит, новый хозяин. Маловат, но ядро ещё бьётся, а это главное.\n\nЯ покажу тебе основы: копать, комнаты, существа и что делать с рыцарями. Делай, как я говорю, и никто не пострадает. Кроме рыцарей. +tut.start = Кривопал: Урок первый — копать. Возьми кирку (клавиша 1), протяни по земле к востоку от сердца, и твои бесята её выкопают. +tut.obj1 = Выкопай проход к востоку от сердца. +tut.dug = Кривопал: Гляди-ка, за ним зал! Твои бесята сами захватывают пол. Теперь открой «Комнаты» и построй логово на своём полу — там спят твои существа. +tut.obj2 = Построй логово (Комнаты). +tut.lair = Кривопал: Кровати есть. Существа ещё и едят: построй рядом грибной сад. +tut.obj3 = Построй грибной сад (Комнаты). +tut.farm = Кривопал: Стол и кров — теперь портал присылает тебе существ. Терпение, они придут сами. Дождись двоих. +tut.obj4 = Дождись, пока через портал придут два существа. +tut.creatures = Кривопал: Вот и они! Немного мотивации никогда не повредит: возьми руку (клавиша 2) и щёлкни по существу, удерживая Shift (на сенсорном экране: коснись дважды), чтобы отвесить ему шлепок. Какое-то время оно будет работать быстрее. +tut.obj5 = Отвесь шлепок одному из своих существ (рука, Shift + щелчок). +tut.slap = Кривопал: Ха! Слышал? С востока что-то идёт. Готовься: молния (Чары) бьёт сильно, а твои существа сражаются сами. +tut.obj6 = Победи двух рыцарей. +tut.knights = Кривопал: Два рыцаря! Пошли своих существ флагом атаки (Приказы) или порази их молнией. +tut.win = Кривопал: Молодец, хозяин! Вот и всё. Ну — почти. Остальное расскажет кампания. Пойду поставлю чайник. diff --git a/lang/sk.lang b/lang/sk.lang index a9b6f0a..d809fba 100644 --- a/lang/sk.lang +++ b/lang/sk.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Tu sú draci ach.wyrm.desc = Žeravý šarkan sa pridá k tvojej kobke. ach.fullhand.name = Plné ruky práce ach.fullhand.desc = Drž v ruke naraz osem jednotiek. + +# tutorial +menu.tutorial = Úvod +tut.name = Prvé kroky +tut.title = Krivoprst ti ukáže, ako sa to robí +tut.story = Tak ty si ten nový pán. Malý, ale jadro ešte bije, a to je hlavné.\n\nUkážem ti základy: kopanie, miestnosti, tvory a čo robiť s rytiermi. Rob, čo poviem, a nikomu sa nič nestane. Okrem rytierov. +tut.start = Krivoprst: Prvá lekcia - kopanie. Vezmi nástroj Kopať (kláves 1), potiahni cez zem na východ od srdca a tvoji čertíci ju vykopú. +tut.obj1 = Vykop tunel na východ od srdca. +tut.dug = Krivoprst: Hľa, za ním je sieň! Tvoji čertíci si zem zaberú sami. Teraz otvor Miestnosti a postav brloh na vlastnej podlahe - tam spia tvoje tvory. +tut.obj2 = Postav brloh (Miestnosti). +tut.lair = Krivoprst: Postele, hotovo. Tvory aj jedia: postav vedľa hubovú záhradu. +tut.obj3 = Postav hubovú záhradu (Miestnosti). +tut.farm = Krivoprst: Strava a nocľah - teraz ti portál posiela tvory. Trpezlivosť, prídu samy. Počkaj na dva. +tut.obj4 = Počkaj, kým cez portál prídu dva tvory. +tut.creatures = Krivoprst: Tu sú! Trocha motivácie nikdy nezaškodí: vezmi ruku (kláves 2) a klikni na tvora s podržaným Shiftom (na dotykovej obrazovke: ťukni naň dvakrát), aby si mu dal zaucho. Chvíľu bude pracovať rýchlejšie. +tut.obj5 = Daj zaucho jednému zo svojich tvorov (ruka, Shift + klik). +tut.slap = Krivoprst: Ha! Počul si? Niečo prichádza z východu. Priprav sa: blesk (Kúzla) udrie tvrdo a tvoje tvory bojujú samy. +tut.obj6 = Poraz dvoch rytierov. +tut.knights = Krivoprst: Dvaja rytieri! Pošli na nich tvory útočnou vlajkou (Rozkazy) alebo ich zasiahni bleskom. +tut.win = Krivoprst: Výborne, pane! To je všetko. No - takmer. Zvyšok povie kampaň. Pristavím vodu na čaj. diff --git a/lang/sr.lang b/lang/sr.lang index 169c1ef..ee3ef6e 100644 --- a/lang/sr.lang +++ b/lang/sr.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Овде су змајеви ach.wyrm.desc = Жарки змај се придружује твојој тамници. ach.fullhand.name = Пуне руке посла ach.fullhand.desc = Држи осам јединица у руци одједном. + +# tutorial +menu.tutorial = Увод +tut.name = Први кораци +tut.title = Кривопрст ти показује како се то ради +tut.story = Дакле, ти си нови господар. Мали, али језгро још куца, а то је оно што се рачуна.\n\nПоказаћу ти основе: копање, собе, створења и шта урадити с витезовима. Ради шта кажем и нико неће страдати. Осим витезова. +tut.start = Кривопрст: Прва лекција - копање. Узми алат за копање (тастер 1), превуци преко земље источно од срца и твоји ђаволци ће је ископати. +tut.obj1 = Ископај тунел источно од срца. +tut.dug = Кривопрст: Ето, иза је дворана! Твоји ђаволци сами освајају тло. Сад отвори Собе и изгради брлог на свом поду - тамо спавају твоја створења. +tut.obj2 = Изгради брлог (Собе). +tut.lair = Кривопрст: Кревети, готово. Створења и једу: изгради врт печурака одмах до њега. +tut.obj3 = Изгради врт печурака (Собе). +tut.farm = Кривопрст: Стан и храна - сад ти портал шаље створења. Стрпљења, долазе сама. Сачекај два. +tut.obj4 = Сачекај да кроз портал дођу два створења. +tut.creatures = Кривопрст: Ево их! Мало мотивације никад не шкоди: узми руку (тастер 2) и кликни створење држећи Shift (на екрану осетљивом на додир: додирни га двапут) да га ошамариш. Неко време ради брже. +tut.obj5 = Ошамари једно од својих створења (рука, Shift + клик). +tut.slap = Кривопрст: Ха! Јеси ли чуо? Нешто долази са истока. Спреми се: муња (Чини) снажно удара, а твоја створења се боре сама. +tut.obj6 = Порази два витеза. +tut.knights = Кривопрст: Два витеза! Пошаљи створења заставом напада (Наредбе) или их удари муњом. +tut.win = Кривопрст: Браво, господару! То је све. Па - скоро. Остатак ће испричати кампања. Идем да ставим воду за чај. diff --git a/lang/sv.lang b/lang/sv.lang index bf95b4e..f7b687d 100644 --- a/lang/sv.lang +++ b/lang/sv.lang @@ -1643,3 +1643,23 @@ ach.wyrm.name = Här finns drakar ach.wyrm.desc = En glödlindorm ansluter sig till din håla. ach.fullhand.name = Fullt upp ach.fullhand.desc = Håll åtta enheter i handen samtidigt. + +# tutorial +menu.tutorial = Introduktion +tut.name = Första stegen +tut.title = Crookfinger visar hur det går till +tut.story = Så du är den nya mästaren. Liten, men kärnan slår fortfarande, och det är det som räknas.\n\nJag ska visa dig grunderna: grävning, rum, varelser och vad man gör med riddare. Gör som jag säger så kommer ingen till skada. Utom riddarna. +tut.start = Crookfinger: Första lektionen: grävning. Ta hackan (tangent 1), dra över jorden öster om hjärtat så gräver dina hobar ut den. +tut.obj1 = Gräv ut gången öster om hjärtat. +tut.dug = Crookfinger: Titta, en sal bakom! Dina hobar tar marken av sig själva. Öppna nu Rum och bygg ett näste på ditt eget golv: där sover dina varelser. +tut.obj2 = Bygg ett näste (Rum). +tut.lair = Crookfinger: Sängar, klart. Varelser äter också: bygg en svampträdgård bredvid. +tut.obj3 = Bygg en svampträdgård (Rum). +tut.farm = Crookfinger: Kost och logi: nu skickar portalen dig varelser. Tålamod, de kommer av sig själva. Vänta på två. +tut.obj4 = Vänta tills två varelser har kommit genom portalen. +tut.creatures = Crookfinger: Där är de! Lite motivation skadar aldrig: ta handen (tangent 2) och klicka på en varelse medan du håller ned Shift (på pekskärm: tryck två gånger) för att ge den en örfil. Då arbetar den snabbare en stund. +tut.obj5 = Ge en av dina varelser en örfil (hand, Shift + klick). +tut.slap = Crookfinger: Ha! Hörde du det? Något kommer från öster. Gör dig redo: blixten (Besvärjelser) slår hårt, och dina varelser slåss av sig själva. +tut.obj6 = Besegra de två riddarna. +tut.knights = Crookfinger: Två riddare! Skicka dina varelser med anfallsflaggan (Order) eller träffa dem med blixten. +tut.win = Crookfinger: Bra gjort, mästare! Det är allt. Nåja – nästan. Kampanjen berättar resten. Jag sätter på tevattnet. diff --git a/src/editor/templates.rs b/src/editor/templates.rs index 28d604e..bcd7022 100644 --- a/src/editor/templates.rs +++ b/src/editor/templates.rs @@ -238,6 +238,16 @@ pub fn demo_campaign() -> CampaignDoc { #[cfg(test)] mod tests { + #[test] + fn the_tutorial_is_a_valid_campaign() { + let doc = super::tutorial_campaign(); + assert!(doc.validate().is_empty(), "{:?}", doc.validate()); + assert_eq!(doc.missions.len(), 1); + let g = crate::campaign::start_editor_mission(&doc.missions[0], 0, 1); + assert!(g.script.is_some()); + assert!(!g.ents.iter().any(|e| e.alive && e.active_hero()), "no knight before the last step"); + } + use super::*; #[test] @@ -278,3 +288,94 @@ mod tests { assert!(g.mission.as_ref().unwrap().goals.contains(&Goal::Shards), "the shard of the outpost is still there"); } } + +// The tutorial: Crookfinger leads a new master step by step - dig the tunnel, claim the hall, +// build a lair and a mushroom garden, wait for the first creatures, slap one, and beat the first +// two knights. Each step switches on the trigger of the next one. Played like an editor campaign +// (title menu: Tutorial); texts come from the language files (tut.*). +pub fn tutorial_campaign() -> CampaignDoc { + let mut doc = CampaignDoc { name: tr("tut.name"), author: "DungeonCraft".into(), language: crate::i18n::language(), ..CampaignDoc::default() }; + let mut m = MissionDoc { + key: "tutorial".into(), + title: tr("tut.title"), + story: tr("tut.story").replace("\\n", "\n"), + size: (64, 64), + seed: 777, + gold: 3000.0, + goals: Vec::new(), + gen: GenDoc { rivers: 0, lava: 0, forts: 0, rivals: 0, difficulty: 0, surface: false }, + pos: (40.0, 60.0), + ..MissionDoc::default() + }; + let saved = (crate::map::mw(), crate::map::mh()); + let mut g = crate::campaign::start_editor_mission(&m, 0, 777); + let (cx, cy) = g.map.core; + let (w, h) = (g.map.w as i32, g.map.h as i32); + let cl = |x: i32, y: i32| (x.clamp(3, w - 4), y.clamp(3, h - 4)); + // east of the heart: a tunnel of earth to dig, then a hall of open ground behind it + let tunnel: Vec<(i32, i32)> = (cx + 4..cx + 8).flat_map(|x| [(x, cy + 1), (x, cy + 2)]).map(|(x, y)| cl(x, y)).collect(); + let (hx0, hy0) = cl(cx + 8, cy - 2); + let (hx1, hy1) = cl(cx + 15, cy + 5); + for y in hy0 - 1..=hy1 + 1 { + for x in hx0..=hx1 + 1 { + let t = &mut g.map.t[crate::map::idx(x, y)]; + let edge = y == hy0 - 1 || y == hy1 + 1 || x == hx1 + 1; + t.kind = if edge { crate::map::Kind::Earth } else { crate::map::Kind::Floor }; + t.owner = crate::map::Owner::None; + t.gold = 0; + t.reinforced = false; + } + } + for &(x, y) in &tunnel { + let t = &mut g.map.t[crate::map::idx(x, y)]; + t.kind = crate::map::Kind::Earth; + t.owner = crate::map::Owner::None; + t.hp = 3.0; + } + // the knights come from a cave further east + let (kx, ky) = cl(cx + 22, cy + 1); + for y in ky - 2..=ky + 2 { + for x in kx - 2..=kx + 2 { + let t = &mut g.map.t[crate::map::idx(x, y)]; + t.kind = crate::map::Kind::Floor; + t.owner = crate::map::Owner::None; + } + } + for x in hx1 + 1..kx - 2 { + let t = &mut g.map.t[crate::map::idx(x, cy + 1)]; + t.kind = crate::map::Kind::Earth; + t.owner = crate::map::Owner::None; + } + g.ents.retain(|e| !e.hero); + g.recount(); + g.init_fog(); + m.zones = vec![ + ZoneDoc { name: "tunnel".into(), shape: "tiles".into(), at: None, radius: None, tiles: Some(tunnel), from: None, to: None, width: None }, + zone_rect("hall", hx0, hy0, hx1, hy1), + ZoneDoc { name: "knights".into(), shape: "circle".into(), at: Some((kx as f32, ky as f32)), radius: Some(1.5), tiles: None, from: None, to: None, width: None }, + ]; + m.map = MapDoc::Fixed { game: serde_json::to_string(&g).unwrap_or_default() }; + crate::map::set_dims(saved.0, saved.1); + + let s = &mut m.scripts; + let obj = |k: &str| Block::Objective { text: tr(k) }; + let on = |t: &str| Block::Trigger { name: t.into(), on: true }; + s.start = vec![say("tut.start"), obj("tut.obj1"), Block::SetVar { name: "knights".into(), value: n(0.0) }, Block::Camera { zone: "tunnel".into() }]; + s.victory = vec![Block::If { cond: cmp(">=", var("knights"), n(2.0)), then: vec![say("tut.win"), Block::Win], els: vec![] }]; + let off = |t: TriggerDoc| TriggerDoc { enabled: false, ..t }; + s.triggers = vec![ + trig("dug", TriggerKind::ZoneDug { zone: "tunnel".into() }, true, vec![say("tut.dug"), obj("tut.obj2"), on("lair")]), + off(trig("lair", TriggerKind::RoomBuilt { room: "Lair".into() }, true, vec![say("tut.lair"), obj("tut.obj3"), on("farm")])), + off(trig("farm", TriggerKind::RoomBuilt { room: "Farm".into() }, true, vec![say("tut.farm"), obj("tut.obj4"), on("creatures")])), + off(trig("creatures", TriggerKind::Value { what: "creatures".into(), var: String::new(), op: ">=".into(), n: 2.0 }, true, vec![say("tut.creatures"), obj("tut.obj5"), on("slap")])), + off(trig( + "slap", + TriggerKind::Slap, + true, + vec![say("tut.slap"), obj("tut.obj6"), Block::Wait { secs: n(20.0) }, Block::Spawn { side: 1, kind: "Knight".into(), count: n(2.0), level: n(1.0), place: Place::Zone("knights".into()), name: String::new() }, say("tut.knights"), Block::Camera { zone: "knights".into() }, on("knight")], + )), + off(trig("knight", TriggerKind::UnitDies { side: 1, kind: String::new(), name: String::new() }, false, vec![Block::AddVar { name: "knights".into(), value: n(1.0) }])), + ]; + doc.missions.push(m); + doc +} diff --git a/src/main.rs b/src/main.rs index bbbb1f0..2a5ccb3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -586,6 +586,7 @@ struct App { coop_editor: bool, // the co-op match plays a mission of an editor campaign coop_run: Option, // ... and this is where the run through that campaign stands offline: bool, // a co-op game played without the server: the other seat is an AI partner + tutorial: bool, // the tutorial mission is being played (its end leads back to the title) fps: f32, renderer: String, frame_ms: f32, @@ -881,7 +882,7 @@ async fn main() { let seed = (miniquad::date::now() * 1000.0) as u32 | 1; // behind the title menu: the endless bridge battle let (game, cam) = Game::new_demo(seed); - let mut app = App { game, cam, settings, seed, status: None, recorded: false, client: MatchClient::new(), ws_id: 0, match_mode: false, coop: false, coop_editor: false, coop_run: None, offline: false, fps: 0.0, renderer: platform::renderer(), frame_ms: 0.0, frame_hist: [0.0; FRAME_HIST], frame_hist_pos: 0, custom_campaign: None, custom_progress: None, custom_mission_index: None, custom_next_index: None, editor: None, editor_testing: false, editor_test_only: false, editor_public_pending: false, editor_loading: None, pending_briefing: None }; + let mut app = App { game, cam, settings, seed, status: None, recorded: false, client: MatchClient::new(), ws_id: 0, match_mode: false, coop: false, coop_editor: false, coop_run: None, offline: false, tutorial: false, fps: 0.0, renderer: platform::renderer(), frame_ms: 0.0, frame_hist: [0.0; FRAME_HIST], frame_hist_pos: 0, custom_campaign: None, custom_progress: None, custom_mission_index: None, custom_next_index: None, editor: None, editor_testing: false, editor_test_only: false, editor_public_pending: false, editor_loading: None, pending_briefing: None }; menu.progress = platform::storage_get(PROGRESS_KEY).and_then(|s| serde_json::from_str(&s).ok()).unwrap_or_default(); apply_game_settings(&mut app.game, &app.settings); let mut inp = Input { ldown: None, rdown: None, rlast: (0.0, 0.0), rdrag: false, mlast: None, minimap_drag: false, tlast: None, touch_world: false, inspect: None }; @@ -1571,6 +1572,24 @@ app.pending_briefing = briefing_of(&menu.campaign_doc, i); } } } + MenuAction::Tutorial => { + let doc = editor::templates::tutorial_campaign(); + let progress = campaign_doc::CampaignProgress::for_doc(&doc); + (app.game, app.cam) = custom_mission_game(&doc, 0, progress.run_seed); + app.pending_briefing = briefing_of(&doc, 0); + apply_game_settings(&mut app.game, &app.settings); + app.game.coop = false; + app.coop = false; + app.recorded = false; + app.custom_campaign = Some(doc); + app.custom_progress = Some(progress); + app.custom_mission_index = Some(0); + app.tutorial = true; + menu.page = None; + ui.log.clear(); + ui.show_help = false; + autosave_t = 0.0; + } MenuAction::OpenRepo => platform::open_url(menu::REPO_URL), MenuAction::OpenClaudeCode => platform::open_url(menu::CLAUDE_CODE_URL), MenuAction::OpenOpenCode => platform::open_url(menu::OPENCODE_URL), @@ -1608,6 +1627,7 @@ app.pending_briefing = briefing_of(&menu.campaign_doc, i); MenuAction::BackToEditor => back_to_editor(&mut app, &mut menu, &mut r3d), MenuAction::MainMenu if app.editor_testing => back_to_editor(&mut app, &mut menu, &mut r3d), MenuAction::MainMenu => { + app.tutorial = false; if app.match_mode || app.game.in_match() { app.leave_match(); } else if app.game.state == 0 { @@ -1689,6 +1709,15 @@ app.pending_briefing = briefing_of(&menu.campaign_doc, i); menu.error = Some(i18n::tr("net.status_offline")); } } + UiAction::EndNext | UiAction::EndCampaign if app.tutorial && app.game.state == 1 => { + app.tutorial = false; + app.custom_campaign = None; + app.custom_progress = None; + app.custom_mission_index = None; + menu.page = Some(Page::Title); + app.seed = next_seed(app.seed); + (app.game, app.cam) = Game::new_demo(app.seed); + } UiAction::EndNext => { if app.custom_campaign.is_some() { let campaign = app.custom_campaign.clone(); diff --git a/src/menu.rs b/src/menu.rs index 2927415..1d0747f 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -301,6 +301,7 @@ enum Btn { MatchChat, Bestiary, Achievements, + Tutorial, BestTab(usize), BestSel(i32), BestPick(usize), @@ -392,6 +393,7 @@ pub enum MenuAction { CampaignStart(usize), OpenRepo, OpenClaudeCode, + Tutorial, // start the tutorial mission BackToEditor, OpenOpenCode, Login(String, String), @@ -875,6 +877,7 @@ impl Menu { Some(s) if s.side != 0 => MenuAction::MatchSetAi(s.side, !s.ai), _ => MenuAction::Consumed, }, + Some(Btn::Tutorial) => MenuAction::Tutorial, Some(Btn::Campaign) => { self.page = Some(Page::Campaign); self.scroll = 0; @@ -1104,6 +1107,7 @@ impl Menu { items.push((Btn::Continue, tr("menu.continue"))); } items.push((Btn::Campaign, tr("menu.campaign"))); + items.push((Btn::Tutorial, tr("menu.tutorial"))); items.push((Btn::CampaignEditor, tr("menu.campaign_editor"))); items.push((Btn::Match, tr("menu.multiplayer"))); items.push((Btn::New, tr("menu.new")));