Utility: Médiá, formátovanie a pomôcky
Úvod · Späť na hlavnú špecifikáciu
Stav implementácie: Pozrite REA-CHEATSHEET.md pre podrobný stav jednotlivých funkcií.
22. Storylety a balíčky
Storylety sú krátke, samostatné naratívne segmenty, ktoré sa dajú aktivovať na základe podmienok:
{storylet priority=5}
{require player.location == "trh"}
{require player.gold > 10}
Obchodník vás zastaví: „Mám dnes špeciálnu ponuku!"
{end storylet}Balíčky (Decks)
Balíčky organizujú storylety do skupín s definovaným správaním výberu:
{deck "nahodne_stretnutia" mode="shuffle"}
{storylet} ... {end storylet}
{storylet} ... {end storylet}
{end deck}Režimy: shuffle (náhodný poriadok), sequence (postupne), weighted (podľa priority).
23. Stavové automaty
Stavové automaty definujú komplexné správanie s explicitnými prechodmi:
{state_machine "dvere"}
{state "zamknute"}
Dvere sú zamknuté.
{transition to="odomknute" when="player.key == true"}
{end state}
{state "odomknute"}
Dvere sú odomknuté.
{transition to="otvorene" when="true"}
{end state}
{state "otvorene"}
Dvere sú otvorené. Môžeš prejsť.
{end state}
{end state_machine}24. Premenný text (Varying text)
Mechanizmy pre text, ktorý sa mení pri opakovaných návštevách:
Sekvenčný text
{first|druhý|tretí|posledný}Cyklický text
{cycle "ráno"|"poludnie"|"večer"|"noc"}Náhodný text
{shuffle "jemný vánok"|"silný vietor"|"búrka"}Jednorazový obsah
{once}
Toto vidíte iba pri prvej návšteve.
{then}
Toto vidíte pri každej ďalšej návšteve.
{end once}25. Lokalizácia a pluralizácia
Vstavané funkcie pre viacjazyčný a gramaticky správny text:
Požiadavka: hostiteľ dodáva locale a politiku formátovania. Kategórie množného čísla a radových čísloviek, zoskupovanie čísel aj štýly dátumu a času sa riešia z CLDR cez
Intlpre locale dodané hostiteľom — engine nemá zabudovanú tabuľku pre konkrétny jazyk.
Pluralizácia
Máš {plural(player.gold, one="1 mincu", few="{player.gold} mince", other="{player.gold} mincí")}.Výber podľa pohlavia
{select(player.gender, male="Hrdina", female="Hrdinka", other="Hrdina/ka")} sa vydal{select(player.gender, male="", female="a", other="(a)")} na cestu.Radové číslovky
Je to tvoja {ordinal(player.visit)} návšteva.ordinal(n) bez pomenovaných argumentov pripája anglické prípony iba pre en* locale; ostatné locale dostanú číslo naformátované podľa locale bez prípony, lebo Intl radové číslovky nevypisuje. Autori, ktorí chcú prípony v inom jazyku, odovzdajú šablóny pre jednotlivé kategórie, kde {} nahradí naformátované číslo:
{ordinal(position, one="{}.", other="{}.")}Formátovanie čísel a dátumov
formatNumber(value, locale?, …) formátuje čísla podľa locale (Intl.NumberFormat) a štandardne používa locale enginu; voliteľný druhý pozičný argument ho prepíše konkrétnym BCP 47 tagom:
Skóre: {formatNumber(player.score)}
Lokalizované: {formatNumber(1234567, "sk")}Dátumy a časy: formatDate(value, style?), formatTime a formatDateTime so style ∈ iso | short | medium | long | full (predvolene medium). Starý tokenový formát YYYY-MM-DD zanikol — celý povrch tvorí enum style.
26. Externý prístup k API
Všetky externé URL sa deklarujú v manifeste a odkazujú sa aliasmi:
{fetch alias="pocasie" into=world.weather}
Vonku je {world.weather.description}.Povolené URL sú definované v reast.json:
{
"allowed_urls": {
"pocasie": "https://api.weather.example/current"
}
}27. Ochrana obsahu
Príkazy pre správu prístupu k obsahu:
{lock type="premium"}
Tento obsah je dostupný iba pre predplatiteľov.
{end lock}
{lock type="purchase" price=2.99}
Bonusová kapitola za jednorazový nákup.
{end lock}Kód rozšírenia sa nikdy nešifruje
Ochrana obsahu pokrýva iba prózu. Loader odmietne zašifrovaný .rext. Šifrovanie je ochrana obsahu, nie bezpečnostná hranica — sandbox obmedzuje rozšírenie rovnako tak či tak —, takže zákaz nič nestojí a získava tri veci: kód sa overí pred spustením prózy (odomykací kód môže prísť uprostred príbehu); kód je auditovateľný bez kľúča (reast validate, editor, moderácia); a cudzí embedder bez kľúča dokáže logiku príbehu spustiť. Úplné pravidlo pozri v Rozšíriteľnosti.
Aby tajomstvo zostalo mimo rozšírenia a predsa sa dalo overiť, ponechajte funkciu všeobecnú a v čistom texte a tajomstvo nastavte cez {set} v zašifrovanej .rea kapitole; funkcia potom overuje proti tej premennej, neobsahuje ju:
{// extensions/gate.rext — čistý text, všeobecné, neobsahuje tajomstvo}
{function unlocked(given, expected) begin}
{return given = expected}
{end function}{// zašifrovaná .rea kapitola nesie tajomstvo}
{set crypt.passphrase = "mesačný-paroh"}Upozornenie, povedané naplno: zašifrovaná .rea nie je tajomstvom pred odhodlaným čitateľom — kľúč sa musí dostať na jeho zariadenie, aby sa kapitola vykreslila, takže premenná je extrahovateľná. Chráni pred spoilermi a náhodným nazretím, nie pred motivovaným útočníkom. Čokoľvek, čo musí byť skutočne nefalšovateľné (súťažná odpoveď, platené odomknutie), sa overuje na serveri — a to je úloha platformy, nie enginu.