TITLE=WarpEngine Batocera Store ROUTE=/stores/warp-engine-batocera-store LOCALE=hu MODIFIED=1792413440 URL=https://wiki.teletypegames.org/hu/stores/warp-engine-batocera-store L=1 #22 L=2 https://batocera.org L=3 #24 L=4 #47 L=5 #43 L=6 https://git.teletypegames.org/stores/warp-engine-batocera-store L=7 #57 L=8 #63 L=9 #64 q│ A cwarp-engine-batocera-storeq egy 1WarpEngine-katalógusból húzza le a q│ játékokat egy 2Batocera-dobozra, EmulationStation-metaadatokkal és q│ borítóképekkel, és saját bejegyzést ad az áruháznak az EmulationStation q│ menüjében. Ez csak a motor: ismeri a WarpEngine API-t, és semmit nem tud q│ egyetlen konkrét oldalról sem. A hoszt, az áruház neve és az, hogy hova q│ kerülnek a játékok, egy külön báruházrepóq cconfig.jsonq fájljából jön. Az a q│ fele, amely nem a Batoceráról szól, a 3warpstore, amelyen a q│ 4RetroArch-motorral osztozik. p warpstore a közös mag — warpstore.py p ▲ p warp-engine-batocera-store ez a motor — store.py, install.sh p ▲ p │ config.json p │ p ┌─────┴─────┬───────────────┐ p │ │ │ p ttg-… my-… other-… áruházrepók p │ │ │ p ▼ ▼ ▼ p teletypegames.org my.example other.example A referenciaáruház a 5ttg-batocera-store. bRepó:0 6https://git.teletypegames.org/stores/warp-engine-batocera-store bKatalógusoldal:0 1WarpEngine bKözös mag:0 3warpstore bTestvérmotor:0 4RetroArch 4áruházmotor bBatocera:0 2https://batocera.org 1Amit kapsz 1══════════ • bSaját menübejegyzés0 — egy körhinta-bejegyzés az áruház nevével, benne platformonként egy mappával. ces_systems_.cfg0 overlayként íródik ki; az indítóparancs és az emulátorlista a doboz saját rendszereiről másolódik, tehát semmi nincs az emulátorokból bedrótozva. • bOldalfüggetlen0 — bármelyik hoszt, amely beilleszti a WarpEngine-t, kaphat áruházat; csak a konfiguráció változik. • bDobozonként több áruház0 — mindegyiké egy ROM-mappa, egy menübejegyzés és a saját állapota, így az egyik áruház takarítása nem érheti el a másik játékait. • bA dobozhoz nem nyúl0 — a játékok az áruház mappájában élnek, nem a doboz rendszereiben. Ezen kívül semmihez nem lehet hozzányúlni, ezen belül pedig csak az törlődik, amit a cstate.json0 nyilvántart. • bBiztonságos az EmulationStation mellett0 — az ES-ből indított szinkron a gamelist írását az ES kilépéséig halasztja, és minden újraíráskor átviszi az ES tulajdonában lévő címkéket (kedvencek, játékszámlálók). • bNulla függőség0 — csak a Python 3 szabványkönyvtára. A Batocera cpython30-at szállít, cpip0-et nem. 1Hogyan működik 1══════════════ p "<áruház neve>" ▸ "Update <áruház neve>" p │ p ├─ GET /api/software a teljes katalógus p ├─ a doboz által futtatható platformok c64 → c64, plus4 → cplus» p 4, tic80 → tic80 p ├─ a legfrissebb nem dev kiadás amely a megfelelő assete» p t hordozza p ├─ GET /api/download?path= .prg / .tic az áruház ma» p ppájába p ├─ GET borítókép p ├─ gamelist.xml kiírása cím, leírás, szerző, kép p └─ es_systems_.cfg kiírása az áruház menübejegyzése r────────────────────────────────────────────────────────────────────────────── 1Az áruház saját menübejegyzése 1══════════════════════════════ Minden, amit az áruház telepít, egyetlen saját mappában él, a c/userdata/roms/0 alatt, benne platformonként egy könyvtárral. Az EmulationStation felhasználói konfigurációjában lévő ces_systems_.cfg platformonként egy ES-rendszert deklarál, mindegyiket ugyanazzal a c értékkel — az ES pedig a csoportból egyetlen körhinta-bejegyzést csinál, benne rendszerenként egy mappával: p fő körhinta: … ▸ Teletype Games ▸ ┌ Commodore 64 p ├ TIC-80 p ├ Ports p └ Update Teletype Games Semmi nincs az emulátorokból bedrótozva. A motor beolvassa a doboz saját c/usr/share/emulationstation/es_systems.cfg0 fájlját, és arról a rendszerről másolja az indítóparancsot, a kiterjesztéseket, a platformot, a témát és az emulátorlistát, amelyiktől kölcsönöz — ez a fájl ehhez az image-hez készült a Batocerától, tehát pontosan azokat az emulátorokat sorolja fel, amelyek a dobozon megvannak. Az egyetlen átírt dolog a c%SYSTEM%0: ezt az ES az indított rendszer nevére cseréli, ami nálunk cttg-c640 lenne, olyan név, amelyet a configgen sosem hallott. Helyette a doboz saját rendszerneve kerül bele, így a mi játékunk pontosan úgy indul, ahogy a doboz indítaná. Öt részlet, mind az EmulationStationé, és kettő közülük egy délutánba került egy valódi dobozon: • bA menübejegyzés deklarált, nem következtetett.0 Az ES magától kitalálná a csoportszülőt, de akkor a témamappája a csoport neve lenne, amivel egyetlen téma sem rendelkezik — a cHideUniqueGroups0 (alapból bekapcsolva) pedig feloldja azt a csoportot, amelyben egyetlen rendszer van, hacsak nem létezik ilyen nevű rendszer. A deklarált szülő mindkettőt megoldja: visz egy c értéket (alapból cports0, ami minden témában megvan), és a helyén tartja a bejegyzést olyan dobozon is, amelyen csak c64-es játékok vannak. • bAzt a rendszert, amelynek nincs saját játéka, eldobja0, nem csak elrejti: a cloadSystem0 ezt naplózza — cSystem "..." has no games! Ignoring it.0 —, és kihajítja. Tehát a bejegyzés nem lehet üres polc: imaga0 a cstore/0 mappa, és a benne lévő frissítő az a játék, amely életben tartja. Ezért is ül az iUpdate i…0 közvetlenül a bejegyzésben, nem egy almappában. • bA bejegyzés nem lehet a rendszerek feletti könyvtár.0 Az ES egy bejárt könyvtárat c/*0 bejegyzéssel jelöl meg a fájl-gyorsítótárában, és a jelölést iazelőtt0 teszi be, hogy beolvasná a tartalmat; onnantól minden alatta lévő útvonal, amely maga nincs gyorsítótárazva, azt válaszolja, hogy „nem létezik" (cFileSystemUtil.cpp0, cgetCacheEntry0). A rendszerek szálkészletben töltődnek be, tehát egy, a rendszerek felett ülő bejegyzés véletlenszerűen elveszíti ezt a versenyt néhányukra nézve, és az ES eldobja őket ezzel: cSystem "..." path does not exist !0 — minden indításkor másik kettőre, ami pontosan úgy néz ki, mint egy témaprobléma. A cstore/0 a testvérük, tehát nincs verseny, amit el lehetne veszíteni. • bAz üres rendszer nem jelenik meg0, így a bejegyzésben soha nincs zsákutca. • bEgy új rendszerhez ES-újraindítás kell0, amit a motor elvégez az olyan szinkron után, amely hozzáadott egyet. Ha a dobozon már van olyan rendszer, amelynek a neve megegyezik az áruházazonosítóval — mondjuk egy cnes0 nevű áruház esetén —, a bejegyzés c-store0 néven jön létre, és a napló ezt közli: az az overlay, amelynek a c0 értéke egy meglévő rendszerrel egyezik, iazt a rendszert módosítja0, nem újat ad hozzá. 2A logója 2──────── Az EmulationStation a rendszer körhinta-logóját a btémán0 keresztül oldja fel (a cSystemData::getProperty("image")0 a témától kéri a csystem/logo0 értéket, a téma pedig a rendszer témamappájából építi fel az útvonalat — a carbon az cart/logos/${system.theme}.png0, majd a c.svg0 fájlt próbálja). Felhasználói szintű felülbírálás nincs, tehát egy egyedi rendszer vagy kölcsönvesz egy témamappát, amelyben már van grafika, vagy a fájl oda kerül, ahol a témák keresik. Mindkettő támogatott: • cmenu.logo0 nélkül a bejegyzés a cports0 mappát kölcsönzi, ami minden témában megvan, tehát van iegy0 ikonja — csak nem az áruházé; • cmenu.logo0 esetén (útvonal vagy URL, illetve ezek listája több formátumhoz) a motor minden téma logómappájába telepíti. Ezt a mappát nem a témaelrendezések ismeretéből találja meg, hanem úgy, hogy megkeresi azoknak a rendszereknek a logóit, amelyek minden témában megvannak (cports0, csnes0, cnes0, …); a fájlt c.0 néven írja ki — a cmenu.theme0 alapértéke ekkor az áruházazonosító, így a téma saját fájljaiból semmi nem íródik felül —, és minden útvonalat rögzít a cstate.json0 fájlban, így az eltávolítás pontosan ezeket veszi vissza, a névütközést pedig jelenti és kihagyja; • ahová nem ér el, ott a téma az áruház bnevét mutatja szövegként0, ami az EmulationStation saját tartalékmegoldása hiányzó logókép esetén. Batocera-fintor: a rendszerimage-dzsel szállított témák a c/usr/share0 alatt vannak, a Batocera gyökere pedig RAM-overlay — a másolat azonnal megjelenik, de újraindítás után eltűnik. Ezért a motor (4.3.0-tól) egy jelölt blokkot tart a c/boot/postshare.sh0-ban — ez az egyetlen boot-hook, amely az EmulationStation előtt fut —, és az visszamásolja a gyorsítótárazott logót oda, ahonnan hiányzik; a c/boot0-ot csak az írás idejére csatolja írhatóra, a fájl többi részéhez nem nyúl, a cpurge0 pedig kiveszi a blokkot. A c/userdata/themes0 alatti témák amúgy is megtartják. A régi viselkedéshez — a játékok a doboz saját rendszerein belül, a gamelistjeibe olvasztva — állítsd az cemulationstation.menu.mode0 értéket cmerge0-re. r────────────────────────────────────────────────────────────────────────────── 1Menübejegyzés előtt telepített áruház frissítése 1════════════════════════════════════════════════ A 4.0-s motorverzió hozza az elrendezésváltást. A frissítés utáni első szinkron leszedi a régi telepítést a dobozról — ROM-ok, borítóképek, port-tartalmak, a mi csomópontjaink a doboz gamelistjeiben, az üres mappák, a Ports-bejegyzés —, majd mindent újra letölt az áruház saját mappájába. A fájlokat szándékosan nem viszi át: a katalógus kicsi, és egy félig átköltöztetett telepítés rosszabb, mint egy kicsit hosszabb szinkron. A c-n0 az egészet megmutatja anélkül, hogy bármit végrehajtana. r────────────────────────────────────────────────────────────────────────────── 1Egy áruház telepítése 1═════════════════════ A telepítő paraméterként kapja az áruházat, így bármilyen konfigurációval működik: p curl -fsSL https://git.teletypegames.org/stores/warp-engine-batocera-store/r» p aw/branch/master/install.sh | p STORE_CONFIG=https://git.example.org/tools/my-store/raw/branch/master/conf» p ig.json sh Checkoutból, helyi konfigurációval: p scp -r warp-engine-batocera-store root@batocera:/tmp/ p ssh root@batocera 'STORE_CONFIG=/tmp/my-config.json /tmp/warp-engine-batocer» p a-store/install.sh' Kiolvassa a cstore.id0 értéket a konfigurációból, a motort és a konfigurációt a c/userdata/system/batocera-store//0 könyvtárba telepíti, kiírja az c-store0 indítót, és lefuttatja az első szinkront — ez hozza létre a menübejegyzést. Az EmulationStationnek újra kell indulnia, hogy lássa. t┌─────────────────────┬──────────────────────────────────────────────────────┐ t│h Környezeti változó t│h Jelentés t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cSTORE_CONFIG0 t│0 bkötelező0 — az áruház cconfig.json0 fájljának útvonala t│ t│0 t│0 vagy URL-je t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cBATOCERA_STORE_ROOT0 t│0 hol élnek az áruházak (alapérték t│ t│0 t│0 c/userdata/system/batocera-store0) t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cBATOCERA_PORTS_DIR0 t│0 Ports-mappa (alapérték c/userdata/roms/ports0) t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cBATOCERA_PORT_NAME0 t│0 a Ports-bejegyzés neve olyan áruháznak, amely még t│ t│0 t│0 kér egyet (alapérték: az áruház cname0 értéke) t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cENGINE_RAW_BASE0 t│0 honnan töltse le a cstore.py0 fájlt t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cWARPSTORE_RAW_BASE0 t│0 honnan töltse le a cwarpstore.py0 fájlt t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cWARPSTORE_SRC0 t│0 egy helyi cwarpstore.py0, amit letöltés helyett t│ t│0 t│0 telepítsen t│ t└─────────────────────┴──────────────────────────────────────────────────────┘ Minden telepítés eldobja az áruház könyvtárában gyorsítótárazott logókat is, így egy áruház, amely logót cserél, az újat juttatja a dobozra; helyi cSTORE_CONFIG0 esetén a cmenu.logo0-ban megnevezett logókat a konfiguráció mellől veszi. r────────────────────────────────────────────────────────────────────────────── 1Áruházrepó írása 1════════════════ Három fájl: p my-batocera-store/ p ├── config.json az áruház: URL, név, almappa, platform-leképezés p ├── install.sh burkoló, amely átadja ezt a konfigurációt a motor telepí» p tőjének p └── README.md Az cinstall.sh0 teljes egészében: p #!/bin/sh p set -eu p FORGE=https://git.teletypegames.org p ENGINE_REF="${ENGINE_REF:-commit/}" p WARPSTORE_REF="${WARPSTORE_REF:-commit/}" p export ENGINE_RAW_BASE="${ENGINE_RAW_BASE:-$FORGE/stores/warp-engine-batocer» p a-store/raw/$ENGINE_REF}" p export WARPSTORE_RAW_BASE="${WARPSTORE_RAW_BASE:-$FORGE/engines/warpstore/ra» p w/$WARPSTORE_REF}" p export STORE_CONFIG="${STORE_CONFIG:-https://git.example.org/tools/my-batoce» p ra-store/raw/branch/master/config.json}" p TMP_DIR="$(mktemp -d)" p trap 'rm -rf "$TMP_DIR"' EXIT p curl -fsSL --retry 3 "$ENGINE_RAW_BASE/install.sh" -o "$TMP_DIR/install.sh" p sh "$TMP_DIR/install.sh" Három dolog benne szándékos. A motor és a cwarpstore0 brögzített commitról0 jön (craw/commit/0), amellyel a konfigurációt kipróbáltuk, így egy push egyik cmaster0-re sem változtatja meg, mit kap egy friss telepítés — motorkiadás után az áruház mindkettőt átírja. A telepítő bfájlba töltődik0, nem a csh0-ba csövezve, így egy sikertelen letöltés hangosan bukik el. Ez a fájl pedig begyedül áll egy bfriss könyvtárban0: a motor telepítője minden mellette talált cstore.py0-t és cwarpstore.py0-t telepít, és egy puszta cmktemp0-fájlnál ez a c/tmp0 lenne. Teljes példa a 5TTG-áruház, CI-val, amely a rögzített motorral tölti be a konfigurációját. Olyan cstore.id0 és cpaths.subfolder0 értéket válassz, amit senki más nem használ — ezek tartják távol egymástól az ugyanazon a dobozon lévő két áruházat, és az azonosító adja a menübejegyzés és az ces_systems0 fájl nevét. r────────────────────────────────────────────────────────────────────────────── 1Használat 1═════════ bAz eszközön.0 i„\<áruház neve>" ▸ „Update \<áruház neve>"0. A szkript letölt mindent, ami új, majd újraindítja az EmulationStationt. Az ES által indított szkriptnek nincs konzolja, így a kimenet az áruház könyvtárában lévő cstore.log fájlba megy. bSSH-n0, a telepítő által kiírt indítón keresztül: p S=/userdata/system/batocera-store/example-store p p $S list # kompatibilis katalógusbejegyzések; * telepítve, ^ » p van frissítés p $S sync # minden újdonság letöltése, a gamelistek és a menü » p frissítése p $S sync blessingofra # csak egy cím (soha nem takarít) p $S -n sync # szárazon futtatás p $S remove c64:demo # eltávolítás (a csupasz név is jó) p $S purge # minden eltávolítása, amit ez az áruház telepített p $S config # az érvényes konfiguráció, és hogy hol van a menübe» p jegyzés A globális kapcsolók az alparancs belé0 jönnek: c$S --roms-root /tmp/roms sync0. r────────────────────────────────────────────────────────────────────────────── 1Eltávolítás 1═══════════ p ssh root@batocera 'curl -fsSL https://git.teletypegames.org/stores/warp-engi» p ne-batocera-store/raw/branch/master/uninstall.sh | sh' Az eltávolítást a motor végzi, nem a shellszkript: előbb cpurge0, majd az esetleges Ports-bejegyzés, az indító és az áruház könyvtára. Csak a cstate.json tudja, mely ROM-ok, borítóképek, port-tartalmak, gamelist-bejegyzések és ES-rendszerek voltak a mieink — és ha nem tud végezni (mondjuk egy felcsatolatlan ROM-gyökér miatt), semmi máshoz nem nyúl, így soha nem maradsz úgy, hogy a fájlok megvannak, de a motor nincs, amely ismerné őket. t┌─────────────────────────────────────┬──────────────────────────────────────┐ t│h Környezeti változó t│h Jelentés t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cSTORE_ID0 t│0 melyik áruházat távolítsa el; csak t│ t│0 t│0 több telepített áruház esetén kell t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cSTORE_CONFIG0 t│0 a cSTORE_ID0 alternatívája — az t│ t│0 t│0 azonosítót a konfigurációból olvassa t│ t│0 t│0 ki t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cDRY_RUN0 t│0 c10 esetén kiírja, mi tűnne el, és t│ t│0 t│0 semmit nem távolít el t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cKEEP_HOME0 t│0 c10 esetén megtartja az áruház t│ t│0 t│0 könyvtárát (állapot, t│ t│0 t│0 katalógus-gyorsítótár, napló) az t│ t│0 t│0 újratelepítéshez t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cBATOCERA_STORE_ROOT0, t│0 ugyanaz, mint a telepítőnél t│ t│0 cBATOCERA_PORTS_DIR0, t│0 t│ t│0 cBATOCERA_PORT_NAME0 t│0 t│ t└─────────────────────────────────────┴──────────────────────────────────────┘ Az áruház saját elrendezésében az eltávolítás teljes: a ROM-mappa, a gamelistek és az ces_systems_.cfg0 mind eltűnnek, a doboz pedig olyan, mint volt. cmerge0 módban ezek szándékosan maradnak: • ba felhasználó által az áruház almappájába tett ROM-ok0 — egy könyvtár csak akkor tűnik el, ha üres, tehát egyetlen kósza fájl megtartja. A cports/.data szintén marad: egy másik áruház is tarthat ott tartalmat. • ba gamelistek0 — ezek a dobozéi. A mi c0 és c0 csomópontjaink eltűnnek; a felhasználó saját játékai, játékszámlálói és kedvencei érintetlenül visszaíródnak. Az általunk ilétrehozott0, üresen maradt gamelist törlődik, hiszen soha nem volt az övé. • ba cgamelist.xml.<áruházazonosító>-backupb fájlok0, a futás végén kilistázva: a gamelistek abban az állapotban, ahogy először találtuk őket. A szárazon futtatás fájlokat listáz, könyvtártörléseket nem: nem tudhatja, mely könyvtárak maradnak üresen. Ha bminden0 áruházat le akarsz szedni egy gépről — mindkét motort, a közös magot, az indítókat —, használd a 3warpstore szkriptjét: p curl -fsSL https://git.teletypegames.org/engines/warpstore/raw/branch/master» p /uninstall.sh | sh r────────────────────────────────────────────────────────────────────────────── 1Hova kerülnek a dolgok 1══════════════════════ p /userdata/system/batocera-store/ p ├── example-store az alábbi áruház indítója p └── example/ p ├── store.py, warpstore.py a motor és a közös magja p ├── config.json az áruház, amely kiválasztotta p └── state.json, catalog.json, store.log p p /userdata/system/configs/emulationstation/es_systems_example.cfg a menübej» p egyzés p //example.png menu.log» p o esetén: a bejegyzés logója p /boot/postshare.sh jelölt blokk, amely bootkor visszate» p szi a /usr-témák logóját p p /userdata/roms/example/ az áruház saját ROM-mappája p ├── c64/ p │ ├── blessingofra-2.2.0.prg, rabbit-1.0.0.prg, … p │ ├── images/blessingofra.png, … p │ └── gamelist.xml p ├── ports/ p │ ├── .sh, images/.png, .data// p │ └── gamelist.xml p └── store/ maga a menübejegyzés p ├── update.sh a szinkron, ahogy a menü indítja p └── gamelist.xml A doboz saját rendszermappáihoz egyáltalán nem nyúl. cmerge0 módban — a régi viselkedés, amely továbbra is elérhető — ugyanez a tartalom a c///0 alá kerül, az elsőként megérintett cgamelist.xml0 fájlról cgamelist.xml.<áruházazonosító>-backup0 másolat készül, és minden összeolvasztás csak az adott áruház almappája alatti csomópontokat írja újra, így két áruház osztozhat egy gamelisten. r────────────────────────────────────────────────────────────────────────────── 1Konfiguráció 1════════════ cconfig.json0 az áruház könyvtárában; a sablon a repóban lévő cconfig.example.json0. t┌────────────────────────┬─────────────────────────┬─────────────────────────┐ t│h Kulcs t│h Alapérték t│h Jelentés t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cstore.id0 t│0 cwarp0 t│0 slug: ez adja az áruház t│ t│0 t│0 t│0 könyvtárának nevét, a t│ t│0 t│0 t│0 naplóelőtagot és a t│ t│0 t│0 t│0 gamelist-mentés nevét t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cstore.name0 t│0 cWarpEngine Store0 t│0 a menübejegyzés t│ t│0 t│0 t│0 megjelenített neve t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cstore.base_url0 t│0 — t│0 a WarpEngine-hoszt t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cstore.api.catalog0 t│0 c/api/software0 t│0 katalógusvégpont, ha a t│ t│0 t│0 t│0 motor máshova van t│ t│0 t│0 t│0 beillesztve t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cstore.api.download0 t│0 c/api/download0 t│0 letöltési végpont t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cpaths.roms_root0 t│0 c/userdata/roms0 t│0 hol élnek a rendszerek t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cpaths.subfolder0 t│0 cwarp0 t│0 az áruház saját mappája t│ t│0 t│0 t│0 a croms_root0 alatt t│ t│0 t│0 t│0 (cmerge0 módban: az t│ t│0 t│0 t│0 almappája minden t│ t│0 t│0 t│0 rendszeren belül) t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.menu.0 t│0 csystem0 t│0 csystem0: az áruház saját t│ t│0 cmode0 t│0 t│0 menübejegyzést kap. t│ t│0 t│0 t│0 cmerge0: a doboz saját t│ t│0 t│0 t│0 rendszereibe telepít t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.menu.0 t│0 cnull0 → cstore.name0 t│0 a menübejegyzés t│ t│0 cname0 t│0 t│0 felirata t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.menu.0 t│0 cnull0 → logóval az t│0 az a témamappa, ahonnan t│ t│0 ctheme0 t│0 áruházazonosító, t│0 a bejegyzés a logóját t│ t│0 t│0 anélkül a cports0 t│0 veszi, és a logófájl t│ t│0 t│0 t│0 neve t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.menu.0 t│0 cnull0 t│0 a bejegyzés saját t│ t│0 clogo0 t│0 t│0 logója: útvonal vagy t│ t│0 t│0 t│0 URL, illetve ezek t│ t│0 t│0 t│0 listája; minden téma t│ t│0 t│0 t│0 logómappájába települ t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.menu.0 t│0 ctrue0 t│0 egy iUpdate …0 bejegyzés t│ t│0 cupdater0 t│0 t│0 a menüben, amely t│ t│0 t│0 t│0 lefuttatja a szinkront t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.menu.0 t│0 c{}0 t│0 rendszerenkénti t│ t│0 clabels0 t│0 t│0 mappafeliratok; a fel t│ t│0 t│0 t│0 nem sorolt rendszer t│ t│0 t│0 t│0 megtartja a doboz saját t│ t│0 t│0 t│0 c0 értékét t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.0 t│0 cnull0 → cfalse0 csystem0 t│0 írjon ki egy t│ t│0 cports_entry0 t│0 módban t│0 Ports-bejegyzést is, t│ t│0 t│0 t│0 amely a szinkront t│ t│0 t│0 t│0 futtatja t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.0 t│0 cWarpEngine Store0 t│0 csak cmerge0 módban: a t│ t│0 cfolder_name0 t│0 t│0 mappánk megjelenített t│ t│0 t│0 t│0 neve a doboz t│ t│0 t│0 t│0 gamelistjében t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.0 t│0 ctrue0 t│0 változás után indítsa t│ t│0 crestart0 t│0 t│0 újra az t│ t│0 t│0 t│0 EmulationStationt t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cemulationstation.0 t│0 cnull0 → t│0 hol tartja az ES a t│ t│0 cconfig_dir0 t│0 c/userdata/system/0 t│0 felhasználói t│ t│0 t│0 cconfigs/0 t│0 konfigurációját t│ t│0 t│0 cemulationstation0 t│0 t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 ccatalog.statuses0 t│0 c["released",0 t│0 mely katalógus-cstatus0 t│ t│0 t│0 c"archived"]0 t│0 értékeket telepítse t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 ccatalog.owner_id0 t│0 cnull0 t│0 szűkítés egyetlen t│ t│0 t│0 t│0 kiadóra t│ t│0 t│0 t│0 (c/api/software?owner_0 t│ t│0 t│0 t│0 cid=0) t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 ccatalog.only0 / t│0 c[]0 t│0 szoftvernév-engedélyező t│ t│0 ccatalog.exclude0 t│0 t│0 / -tiltó lista t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cplatforms0 t│0 c64, plus4, tic80 t│0 platform → rendszer, t│ t│0 t│0 t│0 asset típusa, t│ t│0 t│0 t│0 kiterjesztés, t│ t│0 t│0 t│0 engedélyezve t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cbehavior.prune0 t│0 ctrue0 t│0 távolítsa el azokat a t│ t│0 t│0 t│0 játékokat, amelyek t│ t│0 t│0 t│0 kikerültek a t│ t│0 t│0 t│0 katalógusból vagy a t│ t│0 t│0 t│0 szűrőkből t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cbehavior.timeout0 t│0 c300 t│0 HTTP-időkorlát t│ t│0 t│0 t│0 másodpercben t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cbehavior.insecure0 t│0 cfalse0 t│0 TLS-ellenőrzés t│ t│0 t│0 t│0 kihagyása (saját t│ t│0 t│0 t│0 üzemeltetésű t│ t│0 t│0 t│0 tesztpéldányokhoz) t│ t└────────────────────────┴─────────────────────────┴─────────────────────────┘ 2Platform-leképezés 2────────────────── Egy platform akkor telepíthető, ha a kiadási assetje olyan fájl, amelyet a dobozon meglévő valamelyik rendszer közvetlenül el tud indítani — a „meglévő" itt azt jelenti, hogy szerepel a doboz saját ces_systems.cfg0 fájljában, tehát ebbe az image-be beleépült az emulátor (ROM-mappa attól még lehet ott, hogy nincs mögötte semmi): t┌───────────────────┬──────────────┬──────────────────────┬──────────────┐ t│h Katalógusplatform t│h Asset típusa t│h Batocera-rendszer t│h Kiterjesztés t│ t├───────────────────┼──────────────┼──────────────────────┼──────────────┤ t│0 7cc640 t│0 ccartridge0 t│0 cc640 (VICE) t│0 c.prg0 t│ t│0 8cplus40 t│0 ccartridge0 t│0 ccplus40 (VICE cxplus40) t│0 c.prg0 t│ t│0 9ctic800 t│0 ccartridge0 t│0 ctic800 t│0 c.tic0 t│ t└───────────────────┴──────────────┴──────────────────────┴──────────────┘ A többi (cebitengine0, clove0, cgodot0, cbevy0, cphaser0) chtml0 fájlt és operációs rendszerenkénti zipeket szállít, nem olyan ROM-ot, amit egy rendszer elindít, ezért alapból nincsenek leképezve. Egy hozzáadása konfigurációs szerkesztés: p "platforms": { "godot": { "system": "godot", "kind": "linux_x64", "ext": ".z» p ip", "enabled": true } } r────────────────────────────────────────────────────────────────────────────── 1Hogyan marad biztonságos a szinkron az EmulationStation mellett 1═══════════════════════════════════════════════════════════════ Az EmulationStation memóriában tartja a gamelisteket, és kilépéskor visszaírja őket, tehát egy futása közben végzett összeolvasztás felülíródhat. A menüből indítva (csync-from-es0) a motor előbb letölt, majd az összeolvasztást egy leválasztott capply-gamelists --wait-pid 0 gyerekfolyamatra bízza, amely megvárja a régi ES-folyamat halálát. SSH-ról, futó ES nélkül az összeolvasztás soron belül történik. Az ces_systems0 overlaynek mindebből semmi nem kell: az ES beolvassa, és soha nem írja. Az újrafuttatás idempotens: a meglévő fájlokhoz nem nyúl, egy kiadásemelés (c1.10 → c2.0.00) törli a régi assetet, mielőtt lehúzná az újat, és azt a gamelist- vagy ces_systems0-fájlt, amelynek a tartalma nem változott, egyáltalán nem írja újra. A letöltések a cGET /api/download0 végponton mennek, nem a c/file/ útvonalon, cwarpstore/ (<áruház id>)0 user agenttel; hogy beleszámítanak-e a katalógusstatisztikába, az a host döntése — a teletypegames.org szándékosan kihagyja a cwarpstore/*0-ot (cignored_user_agents0). A szinkron megszakad, ha nem tudja megállapítani, mely rendszerek vannak a dobozon — egy olvashatatlan ces_systems.cfg0 egy felcsatolatlan c/userdata/roms mögött különben úgy nézne ki, mintha „már semmi nem kompatibilis", és letakarítana minden telepített játékot. 1Állapot 1═══════ A cstate.json0 rögzíti, mit telepített az áruház, c:0 kulccsal, így ugyanaz a szoftvernév két rendszeren két külön bejegyzés marad. A clayout megmondja, melyik könyvtárelrendezéshez tartoznak ezek a rekordok: ebből tudja az áruház saját mappájára való átállás, hogy egyszer kell lefutnia — eltávolítja a régi telepítést, a szinkron pedig újra letölti az új helyre. A szétválasztás előtti cttg-store0-ból származó cversion: 10 fájlt az első futáskor migrálja.