{"id":11545,"date":"2026-11-04T11:23:17","date_gmt":"2026-11-04T10:23:17","guid":{"rendered":"https:\/\/retrofixer.it\/?page_id=11545"},"modified":"2026-11-04T11:23:17","modified_gmt":"2026-11-04T10:23:17","slug":"giochi-testuali","status":"publish","type":"page","link":"https:\/\/retrofixer.it\/en\/giochi-testuali\/","title":{"rendered":"Text adventures"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11545\" class=\"elementor elementor-11545\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a3f4aa1 e-con-full e-flex e-con e-parent\" data-id=\"a3f4aa1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3c5365d elementor-widget elementor-widget-html\" data-id=\"3c5365d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<!--\n  RETRO FIXER - Giochi testuali (prima avventura: \"C65 - Il prototipo perduto\")\n  Da incollare in un widget \"HTML\" di Elementor. Tutto lo stile e' racchiuso nella classe .rftg.\n  Bilingue da sola: su \/en\/ (html lang=en) testi e comandi passano in inglese.\n  Ogni testo e' una coppia [italiano, inglese].\n-->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Press+Start+2P&family=VT323&family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\n<style>\n.rftg{\n  --bg:#0f0c24; --bg2:#171338; --panel:#1d1846; --line:#342c74; --text:#eceaff; --muted:#aaa5d8;\n  --c64l:#7c70da; --mag:#e0398a; --yel:#ffd23f; --grn:#5ad15f; --cya:#3fd8ff; --red:#f94144;\n  --crt:#07060f; --pho:#7dff8a;\n  font-family:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif; color:var(--text); background:var(--bg); line-height:1.5;\n  padding:36px 0 28px;\n}\n.rftg *,.rftg *::before,.rftg *::after{box-sizing:border-box}\n.rftg h2,.rftg h3,.rftg p{margin:0;padding:0}\n.rftg h2,.rftg h3{font-family:'Inter',system-ui,sans-serif!important;letter-spacing:0;text-transform:none;font-weight:700}\n.rftg a{color:var(--cya)}\n.rftg button{font:inherit;color:inherit;cursor:pointer}\n.rftg [hidden]{display:none!important}\n\/* il contatore visite sotto la pagina e' trasparente: senza sfondo resta una striscia tra il widget e il footer *\/\n.post-views.post-11545{background:#0f0c24;color:#aaa5d8;margin:0;padding:0 16px 8px;font-size:13px}\n.rftg .wrap{max-width:1200px;margin:0 auto;padding:0 16px}\n.rftg .head h2{font-family:'Press Start 2P',monospace!important;font-size:clamp(18px,3vw,28px);line-height:1.4;color:var(--yel);margin-bottom:12px}\n.rftg .head p{color:var(--muted);max-width:860px;font-size:16px}\n.rftg .cards{display:flex;flex-wrap:wrap;gap:12px;margin:22px 0 18px}\n.rftg .card{display:flex;gap:12px;align-items:center;background:var(--bg2);border:1px solid var(--line);border-radius:10px;padding:12px 14px;max-width:420px;text-align:left}\n.rftg .card[aria-pressed=true]{border-color:var(--c64l);background:var(--panel)}\n.rftg .card .ico{font-family:'VT323',monospace;font-size:26px;color:var(--pho);background:var(--crt);border:1px solid var(--line);border-radius:6px;padding:2px 8px;line-height:1.1}\n.rftg .card b{display:block;font-size:15px;color:#fff}\n.rftg .card span{font-size:13px;color:var(--muted)}\n.rftg .card.soon{opacity:.55;cursor:default}\n.rftg .game{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:14px;align-items:start}\n@media (max-width:900px){.rftg .game{grid-template-columns:minmax(0,1fr)}.rftg .box.move{order:-1}}\n.rftg .screen{background:var(--crt);border:1px solid var(--line);border-radius:12px;overflow:hidden;position:relative;\n  box-shadow:inset 0 0 60px rgba(125,255,138,.06)}\n.rftg .screen::after{content:\"\";position:absolute;inset:0;pointer-events:none;\n  background:repeating-linear-gradient(to bottom,rgba(0,0,0,0) 0,rgba(0,0,0,0) 2px,rgba(0,0,0,.18) 3px)}\n.rftg .art{font-family:'VT323',ui-monospace,Menlo,Consolas,monospace;font-size:clamp(11px,1.9vw,19px);line-height:1.05;color:var(--yel);\n  margin:0;padding:14px 16px 10px;white-space:pre;overflow-x:auto;border-bottom:1px dashed var(--line);min-height:150px;background:none;border-radius:0}\n.rftg .art.dark{color:#3a3566}\n.rftg .out{font-family:'VT323',ui-monospace,Menlo,Consolas,monospace;font-size:20px;line-height:1.25;color:var(--pho);\n  height:min(52vh,460px);overflow-y:auto;padding:12px 16px;scroll-behavior:smooth}\n.rftg .out p{margin:0 0 8px;white-space:pre-wrap;word-wrap:break-word}\n.rftg .out .cmd{color:#fff;opacity:.85}\n.rftg .out .cmd::before{content:\"> \"}\n.rftg .out .room{color:var(--yel);text-transform:uppercase;letter-spacing:.5px;margin-top:6px}\n.rftg .out .say{color:var(--cya)}\n.rftg .out .radio{color:var(--cya)}\n.rftg .out .radio::before{content:\"((o)) \";color:var(--mag)}\n.rftg .out .sys{color:var(--muted)}\n.rftg .out .win{color:var(--yel)}\n.rftg .out .pts{color:var(--mag)}\n.rftg form{display:flex;border-top:1px solid var(--line);margin:0}\n.rftg form label{font-family:'VT323',monospace;font-size:22px;color:var(--pho);padding:8px 0 8px 14px}\n.rftg form input{flex:1;min-width:0;background:none;border:0;outline:none;color:#fff;font-family:'VT323',monospace;font-size:22px;padding:8px 10px;\n  caret-color:var(--pho);box-shadow:none;border-radius:0;margin:0;height:auto}\n.rftg form button{background:var(--panel);border:0;border-left:1px solid var(--line);padding:0 16px;font-family:'VT323',monospace;font-size:20px;color:var(--pho)}\n.rftg .side{display:flex;flex-direction:column;gap:12px}\n.rftg .box{background:var(--bg2);border:1px solid var(--line);border-radius:10px;padding:12px 14px}\n.rftg .box h3{font-size:13px;color:var(--muted);text-transform:uppercase;letter-spacing:.6px;margin-bottom:8px;font-weight:600}\n.rftg .stat{display:grid;grid-template-columns:auto 1fr;gap:3px 10px;font-size:14px}\n.rftg .stat dt{color:var(--muted)}\n.rftg .stat dd{margin:0;color:#fff}\n.rftg .parts{display:flex;flex-wrap:wrap;gap:6px}\n.rftg .parts span{font-family:'VT323',monospace;font-size:17px;padding:1px 8px;border-radius:5px;border:1px solid var(--line);color:#5d578f}\n.rftg .parts span.on{color:var(--crt);background:var(--grn);border-color:var(--grn)}\n.rftg .pad{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;max-width:220px;margin:0 auto}\n.rftg .pad button,.rftg .quick button{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:7px 4px;font-size:14px;color:#fff}\n.rftg .pad button:disabled{opacity:.25;cursor:default}\n.rftg .pad button:not(:disabled):hover,.rftg .quick button:hover{border-color:var(--c64l)}\n.rftg .quick{display:flex;flex-wrap:wrap;gap:6px}\n.rftg .quick button{padding:6px 10px;font-size:13px}\n.rftg .inv{font-size:14px;color:#fff;margin:0;padding-left:18px}\n.rftg .inv li{margin:2px 0}\n.rftg .inv:empty::before{content:attr(data-empty);color:var(--muted);margin-left:-18px}\n.rftg .tip{font-size:13px;color:var(--muted)}\n<\/style>\n\n<div class=\"rftg\" id=\"rftg\" data-no-translation>\n <div class=\"wrap\">\n  <div class=\"head\">\n   <h2 data-t=\"title\"><\/h2>\n   <p data-t=\"intro\"><\/p>\n  <\/div>\n  <div class=\"cards\">\n   <button class=\"card\" type=\"button\" aria-pressed=\"true\"><span class=\"ico\">C65<\/span><span><b data-t=\"g1\"><\/b><span data-t=\"g1d\"><\/span><\/span><\/button>\n   <div class=\"card soon\"><span class=\"ico\">?<\/span><span><b data-t=\"soon\"><\/b><span data-t=\"soond\"><\/span><\/span><\/div>\n  <\/div>\n  <div class=\"game\">\n   <div class=\"screen\">\n    <pre class=\"art\" aria-hidden=\"true\"><\/pre>\n    <div class=\"out\" aria-live=\"polite\"><\/div>\n    <form autocomplete=\"off\"><label for=\"rftg-in\">&gt;<\/label><input id=\"rftg-in\" type=\"text\" spellcheck=\"false\" autocapitalize=\"off\"><button type=\"submit\" data-t=\"send\"><\/button><\/form>\n   <\/div>\n   <div class=\"side\">\n    <div class=\"box\"><h3 data-t=\"hStat\"><\/h3>\n     <dl class=\"stat\"><dt data-t=\"sPlace\"><\/dt><dd class=\"v-place\"><\/dd><dt data-t=\"sScore\"><\/dt><dd class=\"v-score\"><\/dd><dt data-t=\"sMoves\"><\/dt><dd class=\"v-moves\"><\/dd><dt>Mirco<\/dt><dd class=\"v-mirco\"><\/dd><\/dl>\n    <\/div>\n    <div class=\"box\"><h3 data-t=\"hC65\"><\/h3><div class=\"parts\"><span data-p=\"fuse\">PWR<\/span><span data-p=\"cable\">VIDEO<\/span><span data-p=\"rom\">ROM<\/span><span data-p=\"sid\">SID<\/span><\/div><\/div>\n    <div class=\"box move\"><h3 data-t=\"hGo\"><\/h3>\n     <div class=\"pad\">\n      <button type=\"button\" data-d=\"u\"><\/button><button type=\"button\" data-d=\"n\"><\/button><button type=\"button\" data-d=\"d\"><\/button>\n      <button type=\"button\" data-d=\"w\"><\/button><button type=\"button\" data-c=\"look\" data-t=\"bLook\"><\/button><button type=\"button\" data-d=\"e\"><\/button>\n      <span><\/span><button type=\"button\" data-d=\"s\"><\/button><span><\/span>\n     <\/div>\n    <\/div>\n    <div class=\"box\"><h3 data-t=\"hInv\"><\/h3><ul class=\"inv\"><\/ul><\/div>\n    <div class=\"box\"><h3 data-t=\"hQuick\"><\/h3>\n     <div class=\"quick\"><button type=\"button\" data-c=\"search\"><\/button><button type=\"button\" data-c=\"call\"><\/button><button type=\"button\" data-c=\"inv\"><\/button><button type=\"button\" data-c=\"help\"><\/button><button type=\"button\" data-c=\"save\"><\/button><button type=\"button\" data-c=\"load\"><\/button><\/div>\n     <p class=\"tip\" data-t=\"tip\" style=\"margin-top:8px\"><\/p>\n    <\/div>\n   <\/div>\n  <\/div>\n <\/div>\n<\/div>\n\n<script>\n(function(){\nvar root = document.getElementById('rftg');\nif (!root || root.getAttribute('data-ready')) return;\nroot.setAttribute('data-ready', '1');\nvar EN = \/^en\/i.test(document.documentElement.lang || '');\nfunction t(a){ return a[EN ? 1 : 0]; }\nvar KEY = 'rf-tg-c65-v1';\n\n\/* ---------- testi fissi della pagina ---------- *\/\nvar UI = {\n  title: ['Giochi testuali', 'Text adventures'],\n  intro: ['Come nelle avventure testuali degli anni Ottanta: niente grafica (o quasi), solo parole. Leggi la descrizione del luogo, scrivi cosa vuoi fare e premi Invio. Puoi muoverti anche con i pulsanti a lato.',\n          'Just like the text adventures of the eighties: no graphics (well, almost), only words. Read the description of the place, type what you want to do and press Enter. You can also move with the buttons on the side.'],\n  g1: ['C65 - Il prototipo perduto', 'C65 - The Lost Prototype'],\n  g1d: ['Andrea e Mirco devono far ripartire un computer rarissimo.', 'Andrea and Mirco must bring a very rare computer back to life.'],\n  soon: ['Prossima avventura', 'Next adventure'],\n  soond: ['In arrivo...', 'Coming soon...'],\n  send: ['Invio', 'Enter'],\n  hStat: ['Partita', 'Game'], sPlace: ['Luogo', 'Place'], sScore: ['Punti', 'Score'], sMoves: ['Mosse', 'Moves'],\n  hC65: ['Stato del C65', 'C65 status'], hGo: ['Muoviti', 'Move'], hInv: ['Andrea ha con s\u00e9', 'Andrea is carrying'], hQuick: ['Comandi rapidi', 'Quick commands'],\n  bLook: ['Guarda', 'Look'],\n  tip: ['Freccia su per ripetere un comando. Puoi abbreviare: N, S, E, O, X (esamina), I (inventario).',\n        'Up arrow repeats a command. Short forms work: N, S, E, W, X (examine), I (inventory).'],\n  empty: ['niente', 'nothing']\n};\nvar DIRN = { n: ['N', 'N'], s: ['S', 'S'], e: ['E', 'E'], w: ['O', 'W'], u: ['Su', 'Up'], d: ['Gi\u00f9', 'Down'] };\nvar QUICK = { search: ['Cerca', 'Search'], call: ['Chiama Mirco', 'Call Mirco'], inv: ['Inventario', 'Inventory'], help: ['Aiuto', 'Help'], save: ['Salva', 'Save'], load: ['Carica', 'Load'] };\nvar QCMD = { search: ['cerca', 'search'], call: ['chiama mirco', 'call mirco'], inv: ['inventario', 'inventory'], help: ['aiuto', 'help'], save: ['salva', 'save'], load: ['carica', 'load'], look: ['guarda', 'look'] };\nvar DCMD = { n: ['nord', 'north'], s: ['sud', 'south'], e: ['est', 'east'], w: ['ovest', 'west'], u: ['su', 'up'], d: ['giu', 'down'] };\n\n\/* ---------- disegni ASCII dei luoghi ---------- *\/\nvar ART = {\nlab: String.raw`\n .-----------------------------------------.\n |  _________      .------.     |||||||||  |\n | | o  o  o |    | .----. |    | ===== |  |\n | |  _____  |    | |    | |    | ===== |  |\n | | |_____| |    | '----' |    |_______|  |\n | |_________|    '--------'      _\/  \\_   |\n |=====================================[o]=|\n | [C65::::::::::]   ~~\/      [__]  [__]   |\n '-----------------------------------------'`,\nvia: String.raw`\n    _______      ________      _______\n   |  ___  |    | ______ |    | ===== |\n   | |___| |    ||      ||    | [] [] |\n   |  ___  |____||______||____| [] [] |\n __|_|___|_|____|___  ___|____|_______|__\n                   | |\n   ==    ==    ==  | |   ==    ==    ==\n ________________________________________`,\nshop: String.raw`\n  ______________________________________\n | ________   ________   ______________ |\n ||R  C  L || 74LS00 || 27C010  6510  ||\n ||________||________||______________||\n |  ________________________________   |\n | |  \\_____\/    [=]  [===]   [$]   |  |\n | |__________________________________| |\n |______________________________________|`,\nvicolo: String.raw`\n |   |                            |   |\n |   |     ___________________    |   |\n |   |    |\\_________________\/|   |   |\n |   |    |   ___       ___   |   |   |\n |   |    |  |   |     |   |  |   |   |\n |   |    |__|___|_____|___|__|   |   |\n |___|_______O_____________O______|___|`,\nvicolo2: String.raw`\n |   |                            |   |\n |   |  ___________________       |   |\n |   | |\\_________________\/|  ___ |   |\n |   | |   ___       ___   | |___||   |\n |   | |  |   |     |   |  | |o o||   |\n |   | |__|___|_____|___|__| |___||   |\n |___|______O_____________O_______|___|`,\npiazza: String.raw`\n        \/\\             \/\\             \/\\\n       \/  \\    .-.    \/  \\    .-.    \/  \\\n      \/____\\  (   )  \/____\\  (   )  \/____\\\n      |#  #|   '-'   |#  #|   '-'   |#  #|\n   ___|____|____|____|____|____|____|____|___\n  \/____\/ \/____\/ \/____\/ \/____\/ \/____\/ \/____\/`,\ngino: String.raw`\n    __________________________________\n   \/  ____    ____    ____    ____   \/|\n  \/  |____|  |____|  |____|  |____| \/ |\n \/_________________________________\/  |\n | [C64]  [VIC20]  [1541]  [####]  |  \/\n |_________________________________| \/\n  ||                             ||`,\nbar: String.raw`\n   ____________________________________\n  |  BAR        ___     ___     ___    |\n  |  CENTRALE  (   )   (   )   (   )   |\n  |_____________|_|_____|_|_____|_|____|\n  |  ______________________________    |\n  | |______________________________|   |\n  |    ||      ||      ||      ||      |`,\nviale: String.raw`\n      @@@         @@@          \/\\\n     @@@@@       @@@@@        \/  \\______\n      @@@         @@@        \/[]  \\  [] \\\n       |    ___    |        \/______\\____\\\n       |   |   |   |        | [o]  |    |\n  _____|___|___|___|________|______|____|_\n  ========================================`,\ncasa: String.raw`\n  ______________________________________\n |        ____                          |\n |       |____|  <- ? ->                |\n |   _____________          .--.        |\n |  |  o   o   o  |        ( 12 )       |\n |  |_____________|         '--'        |\n |      |     |              ||         |\n |______|_____|______________||_________|`,\nsoffittaBuio: String.raw`\n\n\n\n\n                 .      .\n                    ..\n\n\n\n\n`,\nsoffitta: String.raw`\n        \/\\                          \/\\\n       \/  \\________________________\/  \\\n      \/     _______     ___    ___     \\\n     \/     |FRANCO |   |   |  |   |     \\\n    \/      |_______|   |___|  |___|  ~~  \\\n   \/__________________________________ __\\\n                                     |#|`,\nparco: String.raw`\n     @@@@           .~~~.           @@@@\n    @@@@@@         (  o  )         @@@@@@\n     @@@@      ~~~~~~~|~~~~~~~      @@@@\n      ||      (_______________)      ||\n      ||    __________                ||\n  ____||___|__________|_______________||_\n           ||        ||`,\nclub: String.raw`\n               |\n             --+--\n              \/|\\\n             \/ | \\\n    ________\/__|__\\________\n   |  [===]         [===]  |\n   |      ________   (o)   |\n   |     |   ||   |  [#]   |\n   |_____|___||___|________|`,\nstazione: String.raw`\n  ________________________________________\n |    ___         _______          ___    |\n |   | 1 |       | 10:10 |        | 2 |   |\n |___|___|_______|_______|________|___|___|\n =====|=========|===========|========|=====\n ____|_|_______|_|_________|_|______|_|____`,\nfiera: String.raw`\n   _________________________________\n  |   RETRO  *  EXPO  *  2026       |\n  |_________________________________|\n  |  ____    _______________   ____ |\n  | |    |  |   >>  ||  <<  | |    ||\n  | |____|  |_______||______| |____||\n  |_________________________________|\n          o                o\n         \/|\\  [=======]   \/|\\ `,\nfine: String.raw`\n  ________________________________________\n |                                        |\n |   THE COMMODORE C65 DEVELOPMENT SYSTEM |\n |   BASIC 10.0  ROM 910111               |\n |   128K RAM SYSTEM                      |\n |                                        |\n |   READY.                               |\n |   _                                    |\n |________________________________________|`\n};\n\n\/* ---------- luoghi ---------- *\/\nvar ROOMS = {\n  lab: { n: ['Laboratorio di Mirco', \"Mirco's workshop\"], x: { e: 'via', out: 'via' },\n    d: function(){ return t([\"Il laboratorio di Mirco \u00e8 un caos ordinato: oscilloscopi, saldatori, cassettiere piene di integrati. Sotto la lampada del banco c'\u00e8 lui, il prototipo del Commodore 65, con il case aperto. Il banco ha un cassetto. A est la porta d\u00e0 su Via Roma.\",\n      \"Mirco's workshop is organised chaos: oscilloscopes, soldering irons, drawers full of chips. Under the bench lamp sits the star of the show, the Commodore 65 prototype, with its case open. The bench has a drawer. To the east the door opens onto Via Roma.\"])\n      + ' ' + (S.m.where === 'lab' ? t(['Mirco \u00e8 chino sul banco, con il saldatore in mano.', 'Mirco is bent over the bench, soldering iron in hand.'])\n                                   : t(['Mirco \u00e8 fuori: il saldatore \u00e8 ancora caldo.', 'Mirco is out: the soldering iron is still warm.'])); } },\n  via: { n: ['Via Roma', 'Via Roma'], x: { w: 'lab', e: 'shop', n: 'piazza', s: 'vicolo', in: 'shop' },\n    d: function(){ return t([\"Via Roma, la strada principale di Valdora. A ovest c'\u00e8 il laboratorio di Mirco, a est la vetrina di Elettronica Fabbri. A nord la strada sbuca in piazza, a sud si infila in un vicolo stretto.\",\n      \"Via Roma, Valdora's main street. Mirco's workshop is to the west and the window of Fabbri Electronics to the east. North, the street opens into the square; south, it squeezes into a narrow alley.\"]); } },\n  shop: { n: ['Elettronica Fabbri', 'Fabbri Electronics'], x: { w: 'via', out: 'via' },\n    d: function(){ return t([\"Scaffali di resistenze, condensatori e integrati nei tubetti di plastica. Il signor Fabbri sta dietro al bancone. Vicino alla cassa c'\u00e8 una cesta delle occasioni. L'uscita \u00e8 a ovest.\",\n      \"Shelves of resistors, capacitors and chips in plastic tubes. Mr Fabbri stands behind the counter. Next to the till there is a bargain bin. The way out is west.\"]); } },\n  vicolo: { n: ['Vicolo dei Cassonetti', 'Dumpster Alley'], x: { n: 'via', out: 'via' },\n    d: function(){ return t([\"Un vicolo stretto e umido dietro i negozi. Contro il muro c'\u00e8 un grosso cassonetto verde, stracolmo. L'unica uscita \u00e8 a nord, verso Via Roma.\",\n      \"A narrow, damp alley behind the shops. A big green dumpster, full to the brim, stands against the wall. The only way out is north, back to Via Roma.\"])\n      + (S.f.pushed ? ' ' + t(['Il cassonetto ora \u00e8 staccato dal muro di mezzo metro.', 'The dumpster now stands half a metre away from the wall.']) : ''); } },\n  piazza: { n: ['Piazza del Mercato', 'Market Square'], x: { e: 'gino', w: 'bar', n: 'viale', s: 'via' },\n    d: function(){ return t([\"Il sabato la piazza \u00e8 piena di bancarelle. Tra frutta e vestiti, a est, spicca il banco di Gino, sommerso di vecchi computer. A ovest c'\u00e8 il Bar Centrale, a nord inizia Viale dei Tigli e a sud torni in Via Roma.\",\n      \"On Saturdays the square is packed with stalls. Between the fruit and the clothes, to the east, stands Gino's stall, buried under old computers. The Bar Centrale is to the west, Viale dei Tigli starts to the north and Via Roma is back to the south.\"]); } },\n  gino: { n: ['Il banco di Gino', \"Gino's stall\"], x: { w: 'piazza', out: 'piazza' },\n    d: function(){ return t([\"C64, VIC-20, drive 1541, joystick senza manopola, cassette a pacchi. Gino, maglietta sbiadita con l'arcobaleno Commodore, ti saluta con la mano. La piazza \u00e8 a ovest.\",\n      \"C64s, VIC-20s, 1541 drives, joysticks with no knob, stacks of tapes. Gino, in a faded Commodore rainbow T-shirt, waves at you. The square is to the west.\"]); } },\n  bar: { n: ['Bar Centrale', 'Bar Centrale'], x: { e: 'piazza', out: 'piazza' },\n    d: function(){ return t([\"Il bar profuma di caff\u00e8. Rita, la barista, asciuga i bicchieri. In fondo, a un tavolino, Nonno Pino legge il giornale come ogni mattina da quarant'anni. La porta \u00e8 a est.\",\n      \"The bar smells of coffee. Rita, the barmaid, is drying glasses. At a little table at the back, Grandpa Pino reads the paper, as he has every morning for forty years. The door is to the east.\"]); } },\n  viale: { n: ['Viale dei Tigli', 'Viale dei Tigli'], x: { e: 'casa', in: 'casa', w: 'parco', n: 'stazione', s: 'piazza' },\n    d: function(){ return t([\"Un viale alberato e tranquillo. A est c'\u00e8 una vecchia villetta con il nome BERTONI sul campanello. A ovest si entra nel parco, a nord il viale porta alla stazione e a sud torna in piazza.\",\n      \"A quiet avenue lined with lime trees. To the east is an old house with the name BERTONI on the doorbell. To the west is the park; north, the avenue leads to the station, and south it goes back to the square.\"])\n      + (S.f.rang && !S.f.door ? ' ' + t(['La signora Bertoni ti osserva dalla porta socchiusa, trattenuta dalla catenella.', 'Mrs Bertoni is watching you through the door, held ajar by its chain.']) : ''); } },\n  casa: { n: ['Casa Bertoni', \"Mrs Bertoni's house\"], x: { w: 'viale', out: 'viale', u: 'soffitta' },\n    d: function(){ return t([\"Centrini, foto in bianco e nero, una pendola che ticchetta. La signora Bertoni ti guarda con un mezzo sorriso. Sul soffitto c'\u00e8 una botola da cui pende una cordicella. L'uscita \u00e8 a ovest.\",\n      \"Doilies, black-and-white photos, a ticking pendulum clock. Mrs Bertoni looks at you with half a smile. There is a trapdoor in the ceiling with a cord hanging from it. The way out is west.\"])\n      + (S.f.hatch ? ' ' + t(['La botola \u00e8 aperta: una scaletta di legno sale in soffitta.', 'The trapdoor is open: a wooden ladder leads up to the attic.']) : ''); } },\n  soffitta: { n: ['Soffitta', 'Attic'], x: { d: 'casa' }, dark: true,\n    d: function(){ return lit() ? t([\"Travi, ragnatele e scatoloni. Su uno di questi qualcuno ha scritto a pennarello: FRANCO - LAVORO. La scaletta scende di sotto.\",\n      \"Beams, cobwebs and cardboard boxes. On one of them someone has written in marker: FRANCO - WORK. The ladder goes back down.\"])\n      : t([\"\u00c8 buio pesto. Senti odore di polvere e di carta vecchia. La scaletta scende di sotto.\", \"It is pitch dark. You smell dust and old paper. The ladder goes back down.\"]); } },\n  parco: { n: ['Parco comunale', 'Town park'], x: { e: 'viale', n: 'club' },\n    d: function(){ return t([\"Una fontana con i pesci rossi, qualche panchina, i piccioni. A nord, oltre il prato, c'\u00e8 la palazzina del Club Radioamatori con la sua antenna. Il viale \u00e8 a est.\",\n      \"A fountain with goldfish, a few benches, pigeons. To the north, across the lawn, is the Radio Club building with its antenna. The avenue is to the east.\"]); } },\n  club: { n: ['Club Radioamatori', 'Radio Club'], x: { s: 'parco', in: '!club' },\n    d: function(){ return t([\"Sul tetto un'antenna enorme, sulla porta blindata un cartello: SOLO SOCI. Accanto alla porta c'\u00e8 un citofono. Il parco \u00e8 a sud.\",\n      \"A huge antenna on the roof and a sign on the steel door: MEMBERS ONLY. There is an intercom next to the door. The park is to the south.\"]); } },\n  stazione: { n: ['Stazione', 'Railway station'], x: { s: 'viale', e: 'fiera' },\n    d: function(){ return t([\"Un binario, un orologio fermo da anni e una sala d'attesa con le panche di legno. A est, nel vecchio deposito merci, c'\u00e8 l'ingresso della Retro Expo. Il viale \u00e8 a sud.\",\n      \"One platform, a clock that stopped years ago and a waiting room with wooden benches. To the east, in the old goods shed, is the entrance to the Retro Expo. The avenue is to the south.\"]); } },\n  fiera: { n: ['Ingresso della Retro Expo', 'Retro Expo entrance'], x: { w: 'stazione', e: '!fiera', in: '!fiera' },\n    d: function(){ return t([\"Da dentro arrivano i suoni dei chip SID e il brusio degli espositori. Un manifesto elenca gli stand. Una guardia con la pettorina gialla controlla i pass. La stazione \u00e8 a ovest.\",\n      \"From inside come the sounds of SID chips and the buzz of the exhibitors. A poster lists the stands. A guard in a yellow vest is checking passes. The station is to the west.\"]); } }\n};\n\n\/* ---------- oggetti che si possono prendere ---------- *\/\nvar ITEMS = {\n  radio: { n: ['la ricetrasmittente', 'the walkie-talkie'], a: ['una ricetrasmittente', 'a walkie-talkie'],\n    w: [['radio', 'ricetrasmittente', 'walkie', 'walkietalkie', 'talkie'], ['radio', 'walkie', 'talkie', 'walkietalkie', 'transceiver']],\n    x: [\"Una ricetrasmittente gialla. L'altra ce l'ha Mirco: puoi chiamarlo da qualsiasi posto (CHIAMA MIRCO).\", \"A yellow walkie-talkie. Mirco has the other one: you can call him from anywhere (CALL MIRCO).\"] },\n  foto: { n: ['la polaroid', 'the Polaroid'], a: ['una polaroid del C65', 'a Polaroid of the C65'],\n    w: [['foto', 'fotografia', 'polaroid'], ['photo', 'photograph', 'polaroid', 'picture']],\n    x: [\"Una polaroid che Mirco ha scattato stamattina: il prototipo del C65 appena tirato fuori dalla cantina. Sul retro, a penna: \u00abTrovato! Sabato.\u00bb\", \"A Polaroid Mirco took this morning: the C65 prototype just out of the cellar. On the back, in pen: \u201cFound it! Saturday.\u201d\"] },\n  torcia: { n: ['la torcia', 'the torch'], a: ['una torcia', 'a torch'],\n    w: [['torcia', 'pila', 'lampada'], ['torch', 'flashlight', 'lamp']],\n    x: function(){ return t(['Una torcia a pile, robusta.', 'A sturdy battery torch.']) + ' ' + (S.f.torch ? t(['\u00c8 accesa.', 'It is on.']) : t(['\u00c8 spenta.', 'It is off.'])); } },\n  vcr: { n: ['il videoregistratore', 'the VCR'], a: ['un vecchio videoregistratore', 'an old VCR'],\n    w: [['videoregistratore', 'vcr', 'registratore', 'videoregistratori', 'vhs'], ['vcr', 'video', 'recorder', 'videorecorder', 'vhs']],\n    x: [\"Un videoregistratore VHS degli anni Ottanta, impolverato ma integro. Dentro ci saranno un alimentatore e qualche cinghia di gomma: roba per Mirco.\", \"An eighties VHS recorder, dusty but intact. Inside there will be a power supply and a few rubber belts: a job for Mirco.\"] },\n  banconota: { n: ['la banconota', 'the banknote'], a: ['una banconota da 5 euro', 'a 5-euro note'],\n    w: [['banconota', 'soldi', 'euro', 'denaro', 'cinque', '5'], ['banknote', 'money', 'euro', 'euros', 'fiver', 'cash', 'bill', 'five', '5']],\n    x: ['Cinque euro, un po\\' stropicciati.', 'Five euros, a little crumpled.'] },\n  eprom: { n: [\"l'EPROM\", 'the EPROM'], a: ['una EPROM 27C010 vuota', 'a blank 27C010 EPROM'],\n    w: [['eprom', '27c010', 'chip', 'memoria'], ['eprom', '27c010', 'chip', 'memory']],\n    x: [\"Una EPROM 27C010 da 1 Mbit, nuova, con la finestrella di quarzo coperta da un'etichetta. Va programmata.\", \"A new 1-Mbit 27C010 EPROM, with its quartz window covered by a sticker. It needs programming.\"] },\n  floppy: { n: ['il dischetto', 'the floppy disk'], a: ['un dischetto da 3,5\"', 'a 3.5\" floppy disk'],\n    w: [['floppy', 'dischetto', 'disco', 'disk', 'dischi'], ['floppy', 'disk', 'diskette', 'disc']],\n    x: [\"Un dischetto da 3,5 pollici. Sull'etichetta, a mano: \u00abC65 ROM 910111 - copia di F.B.\u00bb\", \"A 3.5-inch floppy disk. On the label, handwritten: \u201cC65 ROM 910111 - F.B.'s copy\u201d.\"] },\n  biglietto: { n: ['il biglietto', 'the note'], a: ['un biglietto scritto a mano', 'a handwritten note'],\n    w: [['biglietto', 'bigliettino', 'nota', 'foglietto', 'lettera'], ['note', 'card', 'letter', 'message']],\n    x: [\"\u00abA chi riuscir\u00e0 a farlo ripartire. Franco, 1991\u00bb\", \"\u201cTo whoever manages to get it running again. Franco, 1991\u201d\"] },\n  rivista: { n: ['la rivista', 'the magazine'], a: ['una rivista: Commodore Computer Club n. 1', 'a magazine: Commodore Computer Club no. 1'],\n    w: [['rivista', 'giornale', 'ccc', 'numero'], ['magazine', 'mag', 'ccc', 'issue']],\n    x: [\"Commodore Computer Club, numero 1. I collezionisti la cercano da anni: la copertina \u00e8 un po' rovinata ma \u00e8 completa.\", \"Commodore Computer Club, issue 1. Collectors have been hunting for it for years: the cover is a bit worn, but it is complete.\"] },\n  scheda: { n: ['la scheda del C64C', 'the C64C board'], a: ['una scheda madre di C64C guasta', 'a dead C64C motherboard'],\n    w: [['scheda', 'piastra', 'c64c', 'madre', 'motherboard'], ['board', 'motherboard', 'c64c', 'pcb', 'mainboard']],\n    x: [\"Una scheda madre di C64C morta, con i chip ancora sugli zoccoli. C'\u00e8 anche il SID: un 8580.\", \"A dead C64C motherboard, with its chips still in their sockets. The SID is there too: an 8580.\"] }\n};\n\n\/* ---------- arredi e persone (non si prendono) ---------- *\/\nvar FIX = {\n  computer: { at: 'lab', w: [['computer', 'c65', 'prototipo', 'commodore', 'case'], ['computer', 'c65', 'prototype', 'commodore', 'case']], x: function(){ return c65Text(); } },\n  cassetto: { at: 'lab', w: [['cassetto', 'cassettiera'], ['drawer']], x: function(){ return S.f.drawer ? t(['Il cassetto \u00e8 aperto.', 'The drawer is open.']) : t(['Il cassetto del banco \u00e8 chiuso.', 'The bench drawer is closed.']); } },\n  banco: { at: 'lab', w: [['banco', 'tavolo', 'lampada', 'saldatore', 'oscilloscopio'], ['bench', 'workbench', 'table', 'lamp', 'iron', 'oscilloscope']], x: [\"Il banco di Mirco: saldatore, stagno, pompetta dissaldante e un oscilloscopio con pi\u00f9 anni di te.\", \"Mirco's bench: soldering iron, solder, desoldering pump and an oscilloscope older than you.\"] },\n  vetrina: { at: 'via', w: [['vetrina', 'negozio', 'insegna'], ['window', 'shop', 'sign']], x: [\"Nella vetrina di Fabbri: kit di montaggio, saldatori e un cartello \u00abEPROM IN OFFERTA\u00bb.\", \"In Fabbri's window: kits, soldering irons and a sign saying \u201cEPROMS ON OFFER\u201d.\"] },\n  cesta: { at: 'shop', w: [['cesta', 'occasioni', 'cestone', 'offerte'], ['bin', 'basket', 'bargain', 'offers']], x: [\"La cesta delle occasioni: \u00e8 piena di EPROM 27C010 a 5 euro l'una. Basta comprarne una (COMPRA EPROM).\", \"The bargain bin: it is full of 27C010 EPROMs at 5 euros each. You only need to buy one (BUY EPROM).\"] },\n  scaffali: { at: 'shop', w: [['scaffali', 'scaffale', 'componenti', 'resistenze', 'condensatori'], ['shelves', 'shelf', 'components', 'resistors', 'capacitors']], x: [\"Migliaia di componenti, ma niente di specifico per un prototipo del 1991.\", \"Thousands of components, but nothing specific to a 1991 prototype.\"] },\n  cassonetto: { at: 'vicolo', w: [['cassonetto', 'bidone', 'spazzatura', 'pattumiera'], ['dumpster', 'skip', 'bin', 'rubbish', 'trash']], x: function(){ return S.f.pushed ? t(['Ora che \u00e8 staccato dal muro, dietro c\\'\u00e8 spazio.', 'Now that it is away from the wall, there is room behind it.']) : t([\"Un cassonetto verde con le ruote, appoggiato al muro. Tra il cassonetto e il muro c'\u00e8 appena una fessura.\", \"A green wheelie dumpster pushed against the wall. There is barely a gap between it and the wall.\"]); } },\n  bancarelle: { at: 'piazza', w: [['bancarelle', 'bancarella', 'mercato', 'mercatino', 'frutta', 'vestiti'], ['stalls', 'stall', 'market', 'fruit', 'clothes']], x: [\"Frutta, vestiti, pentole... L'unico banco interessante \u00e8 quello di Gino, a est.\", \"Fruit, clothes, pans... The only interesting stall is Gino's, to the east.\"] },\n  roba: { at: 'gino', w: [['computer', 'c64', 'vic', 'roba', 'cianfrusaglie', 'joystick', 'cassette', 'banco'], ['computers', 'computer', 'c64', 'vic', 'stuff', 'junk', 'joystick', 'tapes', 'stall']], x: [\"Tanta roba bella, ma niente che serva al C65. Gino tiene una scheda di C64C sotto il banco, \u00abper gli amici\u00bb.\", \"Lots of lovely stuff, but nothing the C65 needs. Gino keeps a C64C board under the counter, \u201cfor friends\u201d.\"] },\n  caffe: { at: 'bar', w: [['caffe', 'cappuccino', 'bancone', 'bicchieri'], ['coffee', 'espresso', 'counter', 'glasses']], x: ['Il caff\u00e8 di Rita \u00e8 famoso in tutta Valdora.', \"Rita's coffee is famous all over Valdora.\"] },\n  campanello: { at: 'viale', w: [['campanello', 'porta', 'villetta', 'casa', 'bertoni'], ['bell', 'doorbell', 'door', 'house', 'bertoni']], x: [\"Una villetta degli anni Cinquanta. Sul campanello di ottone c'\u00e8 scritto BERTONI.\", \"A house from the fifties. The brass doorbell says BERTONI.\"] },\n  corda: { at: 'casa', w: [['corda', 'cordicella', 'cordino', 'botola', 'scaletta', 'scala'], ['cord', 'string', 'rope', 'trapdoor', 'hatch', 'ladder']], x: function(){ return S.f.hatch ? t(['La botola \u00e8 aperta e la scaletta porta in soffitta.', 'The trapdoor is open and the ladder leads to the attic.']) : t(['Una botola nel soffitto, chiusa. Pende una cordicella.', 'A trapdoor in the ceiling, closed. A cord hangs from it.']); } },\n  foto2: { at: 'casa', w: [['foto', 'fotografie', 'pendola', 'centrini'], ['photos', 'photographs', 'clock', 'doilies']], x: [\"In una delle foto un uomo con i baffi sorride davanti a un capannone: COMMODORE B\u00dcROMASCHINEN GMBH, BRAUNSCHWEIG.\", \"In one of the photos a man with a moustache smiles in front of a factory: COMMODORE B\u00dcROMASCHINEN GMBH, BRAUNSCHWEIG.\"] },\n  scatola: { at: 'soffitta', w: [['scatola', 'scatolone', 'scatoloni', 'franco', 'cassa'], ['box', 'boxes', 'crate', 'franco']], x: function(){ return S.f.box ? t(['Lo scatolone \u00e8 aperto: dentro solo vecchi documenti in tedesco.', 'The box is open: only old papers in German left inside.']) : t([\"Uno scatolone chiuso con del nastro: FRANCO - LAVORO.\", \"A box closed with tape: FRANCO - WORK.\"]); } },\n  fontana: { at: 'parco', w: [['fontana', 'pesci', 'acqua'], ['fountain', 'fish', 'goldfish', 'water']], x: ['Pesci rossi pigri e qualche monetina sul fondo. Lasciale l\u00ec: sono desideri.', 'Lazy goldfish and a few coins on the bottom. Leave them: they are wishes.'] },\n  panchina: { at: 'parco', w: [['panchina', 'panchine', 'panca'], ['bench', 'benches', 'seat']], x: [\"Una panchina di legno verde. Sotto si \u00e8 accumulato un tappeto di foglie.\", \"A green wooden bench. A carpet of leaves has piled up underneath.\"] },\n  citofono: { at: 'club', w: [['citofono', 'porta', 'pulsante', 'cartello', 'antenna'], ['intercom', 'buzzer', 'door', 'button', 'sign', 'antenna']], x: [\"Porta blindata, citofono e un cartello: SOLO SOCI. Mirco \u00e8 socio da vent'anni.\", \"A steel door, an intercom and a sign: MEMBERS ONLY. Mirco has been a member for twenty years.\"] },\n  panca: { at: 'stazione', w: [['panca', 'panche', 'panchina', 'sala', 'attesa', 'orologio'], ['bench', 'benches', 'waiting', 'room', 'clock']], x: [\"Panche di legno lucidate da generazioni di pendolari. Chiss\u00e0 quante cose ci restano dimenticate sotto.\", \"Wooden benches polished by generations of commuters. Who knows how many things get left under them.\"] },\n  manifesto: { at: 'fiera', w: [['manifesto', 'poster', 'cartellone', 'elenco', 'stand'], ['poster', 'sign', 'list', 'stands', 'stand']], x: function(){ setStand(); return t([\"RETRO EXPO 2026 - OGGI ALLESTIMENTO, SOLO ESPOSITORI. Domani apertura al pubblico. Tra gli stand: \u00ab23 - ROSSI: cavi, connettori e ricambi per prototipi\u00bb.\", \"RETRO EXPO 2026 - SET-UP TODAY, EXHIBITORS ONLY. Open to the public tomorrow. Among the stands: \u201c23 - ROSSI: cables, connectors and spares for prototypes\u201d.\"]); } }\n};\nvar NPC = {\n  mirco: { w: [['mirco'], ['mirco']] },\n  gino: { at: 'gino', w: [['gino', 'venditore', 'bancarellaro', 'commerciante'], ['gino', 'seller', 'trader', 'stallholder', 'dealer']] },\n  rita: { at: 'bar', w: [['rita', 'barista', 'cameriera'], ['rita', 'barmaid', 'barista', 'bartender', 'waitress']] },\n  pino: { at: 'bar', w: [['pino', 'nonno', 'vecchio', 'anziano', 'signore'], ['pino', 'grandpa', 'old', 'man', 'oldman', 'gentleman']] },\n  fabbri: { at: 'shop', w: [['fabbri', 'negoziante', 'commesso', 'signor'], ['fabbri', 'shopkeeper', 'owner', 'mr']] },\n  signora: { at: 'casa', w: [['signora', 'bertoni', 'donna', 'vecchietta'], ['mrs', 'bertoni', 'lady', 'woman', 'madam']] },\n  guardia: { at: 'fiera', w: [['guardia', 'sorvegliante', 'addetto', 'buttafuori'], ['guard', 'steward', 'security', 'bouncer']] }\n};\n\n\/* ---------- stato ---------- *\/\nvar S;\nfunction fresh(){\n  return { room: 'lab', loc: { radio: 'inv', foto: 'lab', torcia: null, vcr: null, banconota: null, eprom: null, floppy: null, biglietto: null, rivista: null, scheda: null },\n           f: {}, inst: {}, mh: [], m: { where: 'lab', job: null, t: 0 }, score: 0, moves: 0, over: false };\n}\nfunction lit(){ return !ROOMS[S.room].dark || (S.f.torch && S.loc.torcia === 'inv'); }\nfunction has(id){ return S.loc[id] === 'inv'; }\nfunction here(id){ return S.loc[id] === S.room; }\nfunction addPts(n){ S.score += n; say(t(['[+' + n + ' punti]', '[+' + n + ' points]']), 'pts'); }\nfunction setStand(){ if (!S.f.stand){ S.f.stand = true; addPts(5); } }\n\n\/* ---------- uscita a video ---------- *\/\nvar out = root.querySelector('.out'), art = root.querySelector('.art'), input = root.querySelector('input');\nfunction say(txt, cls){ var p = document.createElement('p'); if (cls) p.className = cls; p.textContent = txt; out.appendChild(p); out.scrollTop = out.scrollHeight; }\nfunction mirco(it, en){ say((S.room === 'lab' && S.m.where === 'lab' ? '' : '') + 'Mirco: ' + t([it, en]), (S.room === 'lab' && S.m.where === 'lab') ? 'say' : 'radio'); }\nfunction npc(name, it, en){ say(name + ': ' + t([it, en]), 'say'); }\n\nfunction showRoom(){\n  var r = ROOMS[S.room];\n  say(t(r.n), 'room');\n  say(r.d());\n  if (lit()){\n    var list = [];\n    for (var id in S.loc) if (S.loc[id] === S.room) list.push(t(ITEMS[id].a));\n    if (list.length) say(t(['Vedi: ', 'You can see: ']) + list.join(', ') + '.');\n  }\n  if (S.room === 'lab' && allDone() && !S.over) say(t([\"Mirco ti fa segno: \u00abVuoi l'onore? Scrivi ACCENDI COMPUTER.\u00bb\", \"Mirco waves you over: \u201cWant the honour? Type TURN ON COMPUTER.\u201d\"]), 'say');\n  draw();\n}\nfunction draw(){\n  var key = S.room;\n  if (S.over) key = 'fine';\n  else if (key === 'soffitta' && !lit()) key = 'soffittaBuio';\n  else if (key === 'vicolo' && S.f.pushed) key = 'vicolo2';\n  art.textContent = (ART[key] || '').replace(\/^\\n\/, '');\n  art.className = 'art' + (key === 'soffittaBuio' ? ' dark' : '');\n  root.querySelector('.v-place').textContent = t(ROOMS[S.room].n);\n  root.querySelector('.v-score').textContent = S.score + ' \/ 100';\n  root.querySelector('.v-moves').textContent = S.moves;\n  root.querySelector('.v-mirco').textContent = S.m.where === 'lab' ? t(['in laboratorio', 'in the workshop']) : S.m.where === 'fiera' ? t(['alla Retro Expo', 'at the Retro Expo']) : t(['al Club Radioamatori', 'at the Radio Club']);\n  [].forEach.call(root.querySelectorAll('.parts span'), function(s){ s.classList.toggle('on', !!S.inst[s.getAttribute('data-p')]); });\n  [].forEach.call(root.querySelectorAll('.pad [data-d]'), function(b){ var d = b.getAttribute('data-d'); b.disabled = !ROOMS[S.room].x[d]; });\n  var ul = root.querySelector('.inv'); ul.innerHTML = '';\n  for (var id in S.loc) if (S.loc[id] === 'inv'){ var li = document.createElement('li'); li.textContent = t(ITEMS[id].a) + (id === 'torcia' && S.f.torch ? t([' (accesa)', ' (on)']) : ''); ul.appendChild(li); }\n}\n\n\/* ---------- il C65 e Mirco ---------- *\/\nfunction allDone(){ return S.inst.fuse && S.inst.cable && S.inst.rom && S.inst.sid; }\nfunction c65Text(){\n  var s = t([\"Il prototipo del Commodore 65: tastiera integrata, drive da 3,5\\\" sul lato destro, scheda madre piena di chip con sigle mai viste in negozio. Ne esistono pochissimi al mondo.\",\n    \"The Commodore 65 prototype: built-in keyboard, 3.5\\\" drive on the right-hand side, a motherboard full of chips with part numbers no shop ever sold. Only a handful exist in the world.\"]);\n  if (!S.inst.fuse) return s + ' ' + t([\"Per ora non d\u00e0 segni di vita.\", \"For now it shows no sign of life.\"]);\n  if (!S.inst.cable) return s + ' ' + t(['Il LED di accensione \u00e8 acceso, ma il monitor resta nero.', 'The power LED is on, but the monitor stays black.']);\n  if (!S.inst.rom) return s + ' ' + t(['Sul monitor compaiono solo caratteri a caso.', 'The monitor shows nothing but random characters.']);\n  if (!S.inst.sid) return s + ' ' + t(['Il BASIC parte, ma non esce un suono: uno zoccolo dei SID \u00e8 vuoto.', 'BASIC starts, but there is no sound: one of the SID sockets is empty.']);\n  return s + ' ' + t(['\u00c8 tutto montato. Non resta che accenderlo.', 'Everything is fitted. All that is left is to turn it on.']);\n}\nfunction hint(){\n  if (S.m.job === 'fiera') return mirco(\"Sono ancora alla Retro Expo: allo stand di Rossi c'\u00e8 la fila. Ti chiamo io!\", \"I'm still at the Retro Expo: there's a queue at Rossi's stand. I'll call you!\");\n  if (S.m.job === 'club') return mirco(\"Sono al club, il programmatore sta scrivendo l'EPROM. Ancora un attimo!\", \"I'm at the club, the programmer is writing the EPROM. Hang on a bit!\");\n  if (!S.inst.fuse){\n    if (has('vcr')) return mirco(\"Hai trovato un videoregistratore? Portamelo in laboratorio, dentro c'\u00e8 quello che mi serve!\", \"You found a VCR? Bring it to the workshop, it's got just what I need inside!\");\n    return mirco(\"L'alimentatore ha il fusibile bruciato, ed \u00e8 un tipo ritardato che non si trova pi\u00f9. I vecchi videoregistratori ne montano uno identico, e hanno pure la cinghia di gomma che serve al floppy. La gente butta di tutto nei vicoli: dai un'occhiata.\",\n      \"The power supply has a blown fuse, and it's a slow-blow type you can't buy any more. Old VCRs have exactly the same one, plus the rubber belt the floppy drive needs. People throw all sorts in the alleys: have a look.\");\n  }\n  if (!S.inst.cable){\n    if (S.f.stand) return mirco(\"Stand 23, Rossi? Perfetto. Quando vuoi, dimmi di andare alla fiera e ci vado io: col mio pass da espositore entro senza problemi.\", \"Stand 23, Rossi? Perfect. Whenever you like, tell me to go to the expo and I'll go: I can get in with my exhibitor pass.\");\n    return mirco(\"Si accende, ma lo schermo \u00e8 nero: il prototipo ha un'uscita video tutta sua e serve il suo cavo. Oggi alla Retro Expo, in stazione, stanno allestendo gli stand: io ho il pass da espositore, tu no. Per\u00f2 ci sono duecento banchi: scopri chi vende cavi per prototipi e ci vado io.\",\n      \"It powers up, but the screen is black: the prototype has its own video output and needs its own cable. Today the Retro Expo at the station is setting up: I've got an exhibitor pass, you haven't. But there are two hundred stands: find out who sells cables for prototypes and I'll go.\");\n  }\n  if (!S.inst.rom){\n    var e = S.mh.indexOf('eprom') >= 0, fl = S.mh.indexOf('floppy') >= 0;\n    if (e && fl) return mirco(\"Ho l'EPROM e il dischetto. Il programmatore di EPROM \u00e8 al Club Radioamatori, dove entrano solo i soci: dimmi di andare al club e ci vado.\", \"I've got the EPROM and the floppy. The EPROM programmer is at the Radio Club, members only: tell me to go to the club and I'll go.\");\n    var need = [];\n    if (!e) need.push(t(['una EPROM vuota da 1 Mbit (una 27C010): le vende Fabbri', 'a blank 1-Mbit EPROM (a 27C010): Fabbri sells them']));\n    if (!fl) need.push(t(['il contenuto della ROM originale... ma chi pu\u00f2 averlo? Al bar sanno tutto di tutti', 'the contents of the original ROM... but who could have that? At the bar they know everybody\\'s business']));\n    return mirco(\"Ora c'\u00e8 l'immagine, ma solo caratteri a caso: la ROM \u00e8 rovinata. Mi servono \" + need.join(', e ') + '.', \"Now there's a picture, but only random characters: the ROM is corrupted. I need \" + need.join(', and ') + '.');\n  }\n  if (!S.inst.sid) return mirco(\"Parte il BASIC 10! Ma non c'\u00e8 audio: uno dei due zoccoli dei SID \u00e8 vuoto. Serve un 8580, quello dei C64C. Gino al mercatino ha sempre qualche scheda rotta.\", \"BASIC 10 starts! But there's no sound: one of the two SID sockets is empty. I need an 8580, the one in the C64C. Gino at the market always has a dead board or two.\");\n  return mirco(\"\u00c8 tutto montato! Vieni in laboratorio e accendilo tu.\", \"It's all fitted! Come to the workshop and turn it on yourself.\");\n}\nfunction checkReady(){ if (allDone()) mirco('Andrea, vieni subito in laboratorio: \u00e8 tutto montato!', \"Andrea, come to the workshop right now: it's all fitted!\"); }\nfunction tick(){\n  S.moves++;\n  if (S.m.job && --S.m.t <= 0){\n    var j = S.m.job; S.m.job = null; S.m.where = 'lab';\n    if (j === 'fiera'){\n      S.inst.cable = true;\n      mirco(\"Trovato! Rossi aveva proprio il cavo video del C65, e me l'ha dato in cambio di una riparazione. Sono tornato in laboratorio e l'ho montato: l'immagine c'\u00e8!\", \"Got it! Rossi had the C65 video cable, and swapped it for a repair job. I'm back at the workshop and it's plugged in: we have a picture!\");\n      addPts(20);\n    } else {\n      S.inst.rom = true; S.mh = S.mh.filter(function(x){ return x !== 'eprom' && x !== 'floppy'; });\n      mirco(\"EPROM programmata e verificata! Sono di nuovo in laboratorio, l'ho messa sullo zoccolo della ROM: si vede il BASIC 10!\", \"EPROM programmed and verified! I'm back at the workshop and it's in the ROM socket: BASIC 10 is up!\");\n      addPts(20);\n    }\n    checkReady();\n  }\n}\nfunction errand(topic){\n  if (S.m.where !== 'lab') return hint();\n  if (topic === 'fiera'){\n    if (S.inst.cable) return mirco('Il cavo l\\'abbiamo gi\u00e0: alla fiera ci torno domani, da visitatore!', \"We've already got the cable: I'll go back to the expo tomorrow, as a visitor!\");\n    if (!S.f.stand) return mirco('Alla Retro Expo ci sono duecento banchi, non so da che parte cominciare. Scopri chi vende cavi per prototipi e ci vado.', \"There are two hundred stands at the Retro Expo, I wouldn't know where to start. Find out who sells cables for prototypes and I'll go.\");\n    S.m.where = 'fiera'; S.m.job = 'fiera'; S.m.t = 5;\n    return mirco('Vado! Stand 23, Rossi. Ti chiamo appena ho novit\u00e0.', \"I'm off! Stand 23, Rossi. I'll call you as soon as I have news.\");\n  }\n  if (S.inst.rom) return mirco(\"La ROM \u00e8 gi\u00e0 a posto. Al club ci vado stasera, a chiacchierare.\", \"The ROM is already done. I'll go to the club tonight, for a chat.\");\n  if (S.mh.indexOf('eprom') < 0 || S.mh.indexOf('floppy') < 0) return mirco(\"Al club c'\u00e8 il programmatore di EPROM, ma prima mi servono una EPROM vuota e il contenuto della ROM. Portameli qui in laboratorio.\", \"The club has the EPROM programmer, but first I need a blank EPROM and the contents of the ROM. Bring them here to the workshop.\");\n  S.m.where = 'club'; S.m.job = 'club'; S.m.t = 4;\n  return mirco('Ci vado subito. Tu intanto continua a cercare: ti chiamo io.', \"I'm on my way. You keep looking in the meantime: I'll call you.\");\n}\n\n\/* ---------- parser ---------- *\/\nvar STOP = [\n  ['il','lo','la','i','gli','le','un','uno','una','del','dello','della','dei','degli','delle','di','da','dal','dallo','dalla','al','allo','alla','ai','agli','alle','a','ad','in','nel','nello','nella','nei','nelle','sul','sullo','sulla','con','col','per','verso','sotto','dentro','dietro','mio','mia','tuo','tua','quel','quello','quella','questo','questa','l','d','se','ha','hai','qualcosa','po','intorno','giro'],\n  ['the','a','an','to','at','with','on','in','into','onto','from','of','for','some','my','your','that','this','under','underneath','behind','inside','around','about','if','he','has','have','anything','something','please','go']\n];\nvar VERBS = [\n  { go: ['vai','va','andare','vado','cammina','corri','muoviti'], look: ['guarda','l','descrivi','dove'], x: ['esamina','x','osserva','ispeziona','controlla','studia'],\n    take: ['prendi','raccogli','piglia','afferra','ordina','bevi'], drop: ['lascia','posa','butta','molla','appoggia'], inv: ['inventario','inv','i','zaino','tasche'],\n    open: ['apri'], close: ['chiudi'], use: ['usa','utilizza','adopera'], push: ['spingi','premi','sposta','muovi'], pull: ['tira','strattona'],\n    give: ['dai','consegna','porgi','regala','mostra','offri','porta','fai'], talk: ['parla','chiama','saluta','contatta','rispondi'], ask: ['chiedi','domanda'],\n    buy: ['compra','acquista','paga','compro'], read: ['leggi'], light: ['accendi'], off: ['spegni'], search: ['cerca','fruga','rovista','perquisisci','frugare'],\n    wait: ['aspetta','attendi','z','riposa'], help: ['aiuto','help','comandi','?','istruzioni'], knock: ['bussa','suona'], climb: ['sali','arrampicati'], descend: ['scendi'],\n    enter: ['entra'], exit: ['esci'], save: ['salva'], load: ['carica','ripristina'], restart: ['ricomincia','riavvia','restart'], score: ['punti','punteggio'] },\n  { go: ['go','walk','run','head','move'], look: ['look','l','where'], x: ['examine','x','inspect','check','study','describe'],\n    take: ['take','get','grab','pick','collect','order','drink'], drop: ['drop','put','leave','discard'], inv: ['inventory','inv','i','invent'],\n    open: ['open'], close: ['close','shut'], use: ['use'], push: ['push','press','shove','ring_'], pull: ['pull','tug','yank'],\n    give: ['give','show','hand','offer','bring'], talk: ['talk','call','speak','hail','greet','radio'], ask: ['ask','tell'],\n    buy: ['buy','purchase','pay'], read: ['read'], light: ['light'], off: ['extinguish'], search: ['search','rummage','find'],\n    wait: ['wait','z'], help: ['help','commands','?','hint'], knock: ['knock','ring','buzz'], climb: ['climb'], descend: ['descend'],\n    enter: ['enter'], exit: ['exit','out'], save: ['save'], load: ['load','restore'], restart: ['restart'], score: ['score','points'] }\n];\nvar DIRS = [\n  { n:'n', nord:'n', s:'s', sud:'s', e:'e', est:'e', o:'w', ovest:'w', w:'w', su:'u', sopra:'u', alto:'u', soffitta:'u', giu:'d', basso:'d', sotto_:'d', dentro_:'in', fuori:'out' },\n  { n:'n', north:'n', s:'s', south:'s', e:'e', east:'e', w:'w', west:'w', u:'u', up:'u', upstairs:'u', attic:'u', d:'d', down:'d', downstairs:'d', inside_:'in', out:'out', outside:'out' }\n];\nfunction norm(s){\n  return s.toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g, '').replace(\/[\u2019'`]\/g, ' ').replace(\/[^a-z0-9\\s?,]\/g, ' ').replace(\/\\s+\/g, ' ').trim();\n}\nfunction verbOf(w){ var V = VERBS[EN ? 1 : 0]; for (var k in V) if (V[k].indexOf(w) >= 0) return k; return null; }\nfunction npcHere(id){ if (id === 'mirco') return S.m.where === 'lab' && S.room === 'lab'; if (id === 'signora') return S.room === 'casa' || (S.room === 'viale' && S.f.rang && !S.f.door); return NPC[id].at === S.room; }\nfunction find(words){\n  var L = EN ? 1 : 0, res = { item: null, fix: null, npc: null, rest: [] };\n  words.forEach(function(w){\n    var hit = false, id;\n    for (id in NPC) if (NPC[id].w[L].indexOf(w) >= 0){ if (!res.npc) res.npc = id; hit = true; }\n    if (!hit) for (id in ITEMS) if (ITEMS[id].w[L].indexOf(w) >= 0 && (has(id) || (here(id) && lit()))){ if (!res.item) res.item = id; hit = true; }\n    if (!hit) for (id in FIX) if (FIX[id].at === S.room && FIX[id].w[L].indexOf(w) >= 0){ if (!res.fix) res.fix = id; hit = true; }\n    if (!hit) for (id in ITEMS) if (ITEMS[id].w[L].indexOf(w) >= 0){ hit = true; res.absent = id; }\n    if (!hit) res.rest.push(w);\n  });\n  return res;\n}\n\nfunction run(raw){\n  var s = norm(raw);\n  if (!s) return;\n  say(raw, 'cmd');\n  if (S.over && !\/^(ricomincia|riavvia|restart|carica|load|restore|aiuto|help)$\/.test(s)){ say(t([\"L'avventura \u00e8 finita. Scrivi RICOMINCIA per giocare di nuovo.\", 'The adventure is over. Type RESTART to play again.']), 'sys'); return; }\n  \/\/ \"mirco, vai alla fiera\" -> chiedi a mirco ...\n  var m = s.match(\/^mirco\\s*,?\\s*(.+)$\/);\n  if (m) s = (EN ? 'ask mirco ' : 'chiedi a mirco ') + m[1];\n  s = s.replace(\/,\/g, ' ');\n  \/\/ forme composte inglesi\n  if (EN){\n    s = s.replace(\/^(pick|picked) up\\b\/, 'take').replace(\/^look (under|behind|beneath)\\b\/, 'search').replace(\/^look (at|in|inside)\\b\/, 'examine').replace(\/^(turn|switch) on\\b\/, 'light').replace(\/^(turn|switch) off\\b\/, 'extinguish')\n         .replace(\/^talk (to|with)\\b\/, 'talk').replace(\/^go (in|inside)\\b\/, 'enter').replace(\/^(go|get) out\\b\/, 'exit').replace(\/^climb (up|down)\\b\/, function(a, b){ return b; })\n         .replace(\/^look for\\b\/, 'search').replace(\/^put down\\b\/, 'drop');\n  } else {\n    s = s.replace(\/^guarda (sotto|dietro)\\b\/, 'cerca').replace(\/^guarda (dentro|nel|nella|il|la|lo|l|le|i|gli)\\b\/, 'esamina').replace(\/^vai (a |in )?(casa|dentro)\\b\/, 'entra').replace(\/^vai fuori\\b\/, 'esci');\n  }\n  var words = s.split(' ');\n  var v = verbOf(words[0]);\n  var D = DIRS[EN ? 1 : 0];\n  if (!v && D[words[0]] && words.length === 1){ go(D[words[0]]); tick(); draw(); return; }\n  if (!v){ say(t(['Non capisco. Prova con un verbo, per esempio ESAMINA, PRENDI o PARLA. Scrivi AIUTO per l\\'elenco.', \"I don't understand. Try a verb, such as EXAMINE, TAKE or TALK. Type HELP for the list.\"]), 'sys'); return; }\n  var rest = words.slice(1).filter(function(w){ return STOP[EN ? 1 : 0].indexOf(w) < 0; });\n  if (v === 'look' && rest.length) v = 'x';\n  if (v === 'go'){\n    var d = rest.map(function(w){ return D[w]; }).filter(Boolean)[0];\n    if (!d && rest.some(function(w){ return \/^(casa|house|bertoni|negozio|shop|club|fiera|expo)$\/.test(w); })) d = 'in';\n    if (!d && rest.some(function(w){ return \/^(laboratorio|lab|workshop)$\/.test(w); })){ say(t(['Dimmi una direzione: nord, sud, est, ovest...', 'Give me a direction: north, south, east, west...']), 'sys'); return; }\n    if (!d){ say(t(['Dove vuoi andare? Nord, sud, est, ovest, su o gi\u00f9.', 'Where do you want to go? North, south, east, west, up or down.']), 'sys'); return; }\n    go(d); tick(); draw(); return;\n  }\n  if (v === 'climb'){ go('u'); tick(); draw(); return; }\n  if (v === 'descend'){ go('d'); tick(); draw(); return; }\n  if (v === 'enter'){ go('in'); tick(); draw(); return; }\n  if (v === 'exit'){ go('out'); tick(); draw(); return; }\n  var meta = { help: 1, save: 1, load: 1, restart: 1, score: 1, inv: 1 };\n  if (meta[v]){ doMeta(v); draw(); return; }\n  var o = find(rest);\n  act(v, o, rest);\n  tick(); draw(); persist(false);\n}\n\nfunction go(d){\n  var r = ROOMS[S.room], to = r.x[d];\n  if (!to){ say(t(['Da qui non si pu\u00f2 andare in quella direzione.', \"You can't go that way from here.\"])); return; }\n  if (to === '!club'){ say(t([\"La porta blindata \u00e8 chiusa: si entra solo con la chiave dei soci. Mirco ce l'ha.\", 'The steel door is locked: only members have a key. Mirco has one.'])); return; }\n  if (to === '!fiera'){ npc(t(['Guardia', 'Guard']), 'Pass, prego. Oggi entrano solo gli espositori: il pubblico domani.', 'Pass, please. Exhibitors only today: the public tomorrow.'); return; }\n  if (to === 'casa' && !S.f.door){ say(t([\"La porta di casa Bertoni \u00e8 chiusa. C'\u00e8 un campanello.\", \"The door of the Bertoni house is closed. There is a doorbell.\"])); return; }\n  if (to === 'soffitta' && !S.f.hatch){ say(t(['La botola sul soffitto \u00e8 chiusa. Ne pende una cordicella.', 'The trapdoor in the ceiling is closed. A cord hangs from it.'])); return; }\n  if (S.room === 'casa' && to === 'viale' && has('floppy') && !S.f.bye){ S.f.bye = true; npc(t(['Signora Bertoni', 'Mrs Bertoni']), 'Il dischetto? Lo porti pure via. Franco sarebbe contento di saperlo in buone mani.', 'The floppy? Do take it. Franco would be glad to know it is in good hands.'); }\n  S.room = to;\n  showRoom();\n}\n\nfunction doMeta(v){\n  if (v === 'help') return say(t([\n    \"COMANDI\\n- Muoversi: NORD, SUD, EST, OVEST (o N, S, E, O), SU, GI\u00d9, ENTRA, ESCI.\\n- GUARDA (o L) descrive il luogo. ESAMINA oggetto (o X oggetto).\\n- PRENDI, LASCIA, INVENTARIO (o I).\\n- APRI, CHIUDI, USA, SPINGI, TIRA, LEGGI, ACCENDI, SPEGNI, SUONA, COMPRA, ASPETTA.\\n- CERCA: Andrea trova quello che gli altri non vedono. Prova anche CERCA SOTTO qualcosa.\\n- DAI oggetto A persona, MOSTRA oggetto A persona.\\n- PARLA CON persona, CHIEDI A persona.\\n- Mirco non lo comandi tu, ma puoi parlargli con la ricetrasmittente da qualsiasi posto: CHIAMA MIRCO. Puoi chiedergli cosa serve, se ha novit\u00e0, o di andare dove tu non puoi entrare: CHIEDI A MIRCO DI ANDARE ALLA FIERA. Per dargli un pezzo devi portarlo in laboratorio.\\n- PUNTI, SALVA, CARICA, RICOMINCIA.\",\n    \"COMMANDS\\n- Moving: NORTH, SOUTH, EAST, WEST (or N, S, E, W), UP, DOWN, ENTER, EXIT.\\n- LOOK (or L) describes the place. EXAMINE object (or X object).\\n- TAKE, DROP, INVENTORY (or I).\\n- OPEN, CLOSE, USE, PUSH, PULL, READ, TURN ON, TURN OFF, RING, BUY, WAIT.\\n- SEARCH: Andrea finds what others miss. Try SEARCH UNDER something too.\\n- GIVE object TO person, SHOW object TO person.\\n- TALK TO person, ASK person.\\n- You don't control Mirco, but you can talk to him on the walkie-talkie from anywhere: CALL MIRCO. Ask him what he needs, whether he has news, or to go where you can't get in: ASK MIRCO TO GO TO THE EXPO. To hand him a part you must take it to the workshop.\\n- SCORE, SAVE, LOAD, RESTART.\"]), 'sys');\n  if (v === 'inv'){\n    var l = []; for (var id in S.loc) if (S.loc[id] === 'inv') l.push(t(ITEMS[id].a));\n    return say(t(['Hai con te: ', 'You are carrying: ']) + (l.length ? l.join(', ') : t(['niente', 'nothing'])) + '.');\n  }\n  if (v === 'score') return say(t(['Punti: ' + S.score + ' su 100, in ' + S.moves + ' mosse.', 'Score: ' + S.score + ' out of 100, in ' + S.moves + ' moves.']), 'sys');\n  if (v === 'save') return persist(true);\n  if (v === 'load'){\n    var j = null; try { j = JSON.parse(localStorage.getItem(KEY)); } catch(e){}\n    if (!j || !j.loc){ say(t(['Non trovo nessuna partita salvata su questo browser.', 'There is no saved game in this browser.']), 'sys'); return; }\n    S = j; say(t(['Partita caricata.', 'Game loaded.']), 'sys'); showRoom(); return;\n  }\n  if (v === 'restart'){ S = fresh(); out.innerHTML = ''; intro(); }\n}\nfunction persist(loud){\n  try { localStorage.setItem(KEY, JSON.stringify(S)); if (loud) say(t(['Partita salvata su questo browser. CARICA per riprenderla.', 'Game saved in this browser. LOAD to pick it up again.']), 'sys'); }\n  catch(e){ if (loud) say(t(['Questo browser non permette di salvare.', 'This browser does not allow saving.']), 'sys'); }\n}\n\n\/* ---------- azioni ---------- *\/\nfunction act(v, o, rest){\n  var it = o.item, fx = o.fix, who = o.npc;\n  var dark = !lit();\n  if (o.absent && !it && !fx && !who && v !== 'buy' && v !== 'search' && v !== 'talk' && v !== 'ask' && v !== 'give' && v !== 'drop'){\n    say(t(['Qui non vedi ' + ITEMS[o.absent].n[0] + '.', \"You can't see \" + ITEMS[o.absent].n[1] + ' here.'])); return;\n  }\n  if (dark && (v === 'x' || v === 'take' || v === 'open' || v === 'search' || v === 'read' || v === 'push' || v === 'pull') && it !== 'torcia'){\n    say(t(['\u00c8 troppo buio per vedere qualcosa. Ti servirebbe un po\\' di luce.', \"It's too dark to see anything. You could do with some light.\"])); return;\n  }\n  switch (v){\n  case 'look': showRoom(); return;\n  case 'wait': say(t(['Aspetti un po\\'. Valdora va avanti per conto suo.', 'You wait a while. Valdora goes about its business.'])); return;\n\n  case 'x':\n    if (it){ var d = ITEMS[it].x; say(typeof d === 'function' ? d() : t(d)); return; }\n    if (fx){ var e = FIX[fx].x; say(typeof e === 'function' ? e() : t(e)); return; }\n    if (who) return lookNpc(who);\n    say(t(['Non vedi niente del genere qui.', \"You don't see anything like that here.\"])); return;\n\n  case 'take':\n    if (S.room === 'bar' && (fx === 'caffe' || \/caff|coffee|espresso\/.test(rest.join(' ')))){ npc('Rita', 'Ecco il tuo caff\u00e8. Offre la casa, ma non ripara computer!', \"Here's your coffee. On the house, but it won't fix computers!\"); return; }\n    if (it){\n      if (has(it)){ say(t(['Ce l\\'hai gi\u00e0.', 'You already have it.'])); return; }\n      S.loc[it] = 'inv';\n      say(t(['Preso: ' + ITEMS[it].n[0] + '.', 'Taken: ' + ITEMS[it].n[1] + '.']));\n      if (it === 'vcr') say(t(['Pesa, ma ce la fai.', \"It's heavy, but you manage.\"]));\n      if (it === 'floppy' && !S.f.gotFloppy){ S.f.gotFloppy = true; addPts(10); }\n      if (it === 'rivista' && !S.f.gotMag){ S.f.gotMag = true; addPts(5); }\n      return;\n    }\n    if (fx === 'computer'){ say(t(['\u00c8 di Mirco, ed \u00e8 un prototipo unico: meglio lasciarlo sul banco.', \"It's Mirco's, and it's a one-off prototype: best left on the bench.\"])); return; }\n    if (fx === 'fontana'){ say(t(['Le monetine della fontana sono i desideri della gente. Lasciale dove sono.', \"The coins in the fountain are people's wishes. Leave them where they are.\"])); return; }\n    if (fx === 'cesta'){ say(t(['Le EPROM non sono gratis: COMPRA EPROM.', \"The EPROMs aren't free: BUY EPROM.\"])); return; }\n    if (fx === 'roba'){ npc('Gino', 'Ehi, ehi! Qui si compra o si scambia, non si prende.', 'Hey, hey! Here you buy or swap, you don\\'t just take.'); return; }\n    if (who){ say(t(['Meglio di no.', 'Better not.'])); return; }\n    if (fx){ say(t(['Non \u00e8 il genere di cosa che si porta in tasca.', \"That's not the sort of thing you carry around.\"])); return; }\n    say(t(['Prendere cosa?', 'Take what?'])); return;\n\n  case 'drop':\n    if (!it || !has(it)){ say(t(['Non ce l\\'hai.', \"You don't have that.\"])); return; }\n    S.loc[it] = S.room; if (it === 'torcia') S.f.torch = S.f.torch;\n    say(t(['Lasciato: ' + ITEMS[it].n[0] + '.', 'Dropped: ' + ITEMS[it].n[1] + '.'])); return;\n\n  case 'open':\n    if (fx === 'cassetto'){\n      if (S.f.drawer){ say(t(['\u00c8 gi\u00e0 aperto.', \"It's already open.\"])); return; }\n      S.f.drawer = true; S.loc.torcia = 'lab';\n      say(t(['Apri il cassetto: dentro, tra rotoli di stagno e cacciaviti, c\\'\u00e8 una torcia.', 'You open the drawer: among reels of solder and screwdrivers there is a torch.'])); return;\n    }\n    if (fx === 'scatola'){\n      if (S.f.box){ say(t(['\u00c8 gi\u00e0 aperto.', \"It's already open.\"])); return; }\n      S.f.box = true; S.loc.floppy = 'soffitta'; S.loc.biglietto = 'soffitta';\n      say(t(['Strappi il nastro. Sotto una pila di documenti in tedesco c\\'\u00e8 un dischetto da 3,5\", con sopra un biglietto scritto a mano.', 'You tear off the tape. Under a pile of papers in German there is a 3.5\" floppy disk, with a handwritten note on top.'])); return;\n    }\n    if (fx === 'cassonetto'){ say(t(['Sollevi il coperchio: solo sacchi della spazzatura. Bleah. Ma tra il cassonetto e il muro...?', 'You lift the lid: just rubbish bags. Yuck. But what about the gap between the dumpster and the wall...?'])); return; }\n    if (fx === 'corda'){ return pullCord(); }\n    if (fx === 'campanello'){ say(t(['\u00c8 chiusa. Prova a suonare il campanello.', \"It's shut. Try ringing the bell.\"])); return; }\n    if (fx === 'citofono'){ say(t(['La porta blindata non si apre senza chiave.', \"The steel door won't open without a key.\"])); return; }\n    if (fx === 'computer'){ say(t(['Il case \u00e8 gi\u00e0 aperto: Mirco ci lavora da stamattina.', 'The case is already open: Mirco has been working on it since this morning.'])); return; }\n    if (it === 'vcr'){ say(t(['Lascia fare a Mirco: lui sa cosa cercare l\u00e0 dentro.', 'Leave that to Mirco: he knows what to look for in there.'])); return; }\n    say(t(['Non si apre.', \"It doesn't open.\"])); return;\n\n  case 'close':\n    if (fx === 'cassetto' && S.f.drawer){ say(t(['Lo lasci aperto: tanto \u00e8 il cassetto di Mirco.', \"You leave it open: it's Mirco's drawer anyway.\"])); return; }\n    say(t(['Non c\\'\u00e8 niente da chiudere.', 'There is nothing to close.'])); return;\n\n  case 'push': case 'pull':\n    if (fx === 'cassonetto'){\n      if (S.f.pushed){ say(t(['L\\'hai gi\u00e0 spostato abbastanza.', \"You've already moved it far enough.\"])); return; }\n      S.f.pushed = true; S.loc.vcr = 'vicolo';\n      say(t(['Ti metti di spalla e ' + (v === 'push' ? 'spingi' : 'tiri') + ': le ruote cigolano e il cassonetto si stacca dal muro di mezzo metro. Dietro c\\'era un vecchio videoregistratore VHS!', 'You put your shoulder into it and ' + v + ': the wheels squeak and the dumpster comes half a metre away from the wall. Behind it there was an old VHS recorder!'])); return;\n    }\n    if (fx === 'corda') return pullCord();\n    if (fx === 'campanello' || fx === 'citofono') return knock();\n    if (fx === 'computer'){ say(t(['Meglio di no: \u00e8 un pezzo unico.', 'Better not: it\\'s one of a kind.'])); return; }\n    say(t(['Non succede niente.', 'Nothing happens.'])); return;\n\n  case 'knock': return knock();\n\n  case 'light':\n    if (it === 'torcia' || (!it && !fx && has('torcia') && S.room === 'soffitta')){\n      if (!has('torcia')){ say(t(['Prima devi averla in mano.', 'You need to be holding it first.'])); return; }\n      if (S.f.torch){ say(t(['\u00c8 gi\u00e0 accesa.', \"It's already on.\"])); return; }\n      S.f.torch = true; say(t(['Accendi la torcia. Un cono di luce bianca.', 'You turn on the torch. A cone of white light.']));\n      if (S.room === 'soffitta') showRoom();\n      return;\n    }\n    if (fx === 'computer') return powerOn();\n    if (it === 'radio') return talkMirco();\n    say(t(['Non \u00e8 una cosa che si accende.', \"That isn't something you can turn on.\"])); return;\n\n  case 'off':\n    if (it === 'torcia' && S.f.torch){ S.f.torch = false; say(t(['Spegni la torcia.', 'You turn off the torch.'])); if (S.room === 'soffitta') showRoom(); return; }\n    say(t(['Non c\\'\u00e8 niente da spegnere.', 'There is nothing to turn off.'])); return;\n\n  case 'read':\n    if (it === 'biglietto' || it === 'floppy' || it === 'rivista' || it === 'foto'){ var r = ITEMS[it].x; say(typeof r === 'function' ? r() : t(r)); return; }\n    if (fx === 'manifesto' || fx === 'citofono' || fx === 'campanello'){ var q = FIX[fx].x; say(typeof q === 'function' ? q() : t(q)); return; }\n    say(t(['Non c\\'\u00e8 niente da leggere.', 'There is nothing to read.'])); return;\n\n  case 'search': return search(fx, it);\n\n  case 'buy':\n    if (S.room === 'bar'){ npc('Rita', 'Un caff\u00e8? Te lo offro io, tesoro.', \"A coffee? This one's on me, love.\"); return; }\n    if (S.room !== 'shop'){ say(t(['Qui non c\\'\u00e8 niente in vendita che ti serva.', 'Nothing for sale here that you need.'])); return; }\n    return buyEprom();\n\n  case 'use':\n    if (it === 'torcia') return act('light', o, rest);\n    if (it === 'radio') return talkMirco();\n    if (it === 'banconota') return S.room === 'shop' ? buyEprom() : say(t(['Qui non c\\'\u00e8 niente da comprare.', 'There is nothing to buy here.']));\n    if (it === 'foto' && S.room === 'viale') return give('foto', 'signora');\n    if (fx === 'computer') return powerOn();\n    if (fx === 'corda') return pullCord();\n    if (fx === 'cassonetto') return act('push', o, rest);\n    if (fx === 'campanello' || fx === 'citofono') return knock();\n    say(t(['Non sai bene come usarlo, qui.', \"You're not sure how to use that here.\"])); return;\n\n  case 'give':\n    if (!it && o.absent){ say(t([\"Non ce l'hai.\", \"You don't have that.\"])); return; }\n    if (!it){ say(t(['Cosa vuoi dare?', 'What do you want to give?'])); return; }\n    if (!has(it)){ say(t(['Non ce l\\'hai.', \"You don't have that.\"])); return; }\n    if (!who){\n      var pres = ['gino', 'rita', 'pino', 'fabbri', 'signora', 'guardia', 'mirco'].filter(npcHere);\n      if (pres.length === 1) who = pres[0];\n      else { say(t(['A chi?', 'To whom?'])); return; }\n    }\n    return give(it, who);\n\n  case 'talk': case 'ask':\n    if (!who){\n      var p = ['gino', 'signora', 'fabbri', 'guardia', 'pino', 'rita', 'mirco'].filter(npcHere);\n      who = p.length ? p[0] : 'mirco';\n      if (S.room === 'bar' && v === 'talk' && !o.npc){ say(t(['Al bar ci sono Rita e Nonno Pino: con chi vuoi parlare?', 'Rita and Grandpa Pino are in the bar: who do you want to talk to?'])); return; }\n    }\n    return talk(who, rest, v);\n  }\n}\n\nfunction lookNpc(who){\n  var D = {\n    mirco: ['Mirco: occhiali sulla fronte, dita macchiate di stagno. Ripara qualsiasi cosa, purch\u00e9 qualcuno gli trovi i pezzi.', 'Mirco: glasses pushed up on his forehead, fingers stained with solder. He can fix anything, as long as someone finds him the parts.'],\n    gino: ['Gino conosce ogni computer passato da Valdora negli ultimi quarant\\'anni.', 'Gino knows every computer that has passed through Valdora in the last forty years.'],\n    rita: ['Rita sa tutto di tutti, ma lo racconta solo a chi le sta simpatico.', 'Rita knows everybody\\'s business, but only tells it to people she likes.'],\n    pino: ['Nonno Pino: coppola, giornale, caff\u00e8 corretto. Memoria di ferro.', 'Grandpa Pino: flat cap, newspaper, laced coffee. A memory like a steel trap.'],\n    fabbri: ['Il signor Fabbri: camice grigio e matita dietro l\\'orecchio.', 'Mr Fabbri: grey coat and a pencil behind his ear.'],\n    signora: ['Una signora minuta, con gli occhi vivaci e un golfino lilla.', 'A small lady with bright eyes and a lilac cardigan.'],\n    guardia: ['Una guardia con la pettorina gialla e l\\'aria di chi ha gi\u00e0 detto \u00abno\u00bb cento volte oggi.', 'A guard in a yellow vest, with the look of someone who has already said \u201cno\u201d a hundred times today.']\n  };\n  if (who !== 'mirco' && !npcHere(who)){ say(t(['Qui non c\\'\u00e8.', \"They aren't here.\"])); return; }\n  say(t(D[who]));\n}\n\nfunction knock(){\n  if (S.room === 'viale'){\n    if (S.f.door){ say(t(['La porta \u00e8 aperta: puoi entrare (EST).', 'The door is open: you can go in (EAST).'])); return; }\n    S.f.rang = true;\n    say(t(['Suoni. Dopo un po\\' la porta si apre di una spanna, trattenuta dalla catenella. Una signora anziana ti scruta.', 'You ring. After a while the door opens a crack, held by its chain. An elderly lady peers at you.']));\n    npc(t(['Signora Bertoni', 'Mrs Bertoni']), 'S\u00ec? Non compro niente, eh. E non conosco nessun Andrea.', \"Yes? I'm not buying anything, mind. And I don't know any Andrea.\");\n    return;\n  }\n  if (S.room === 'club'){ say(t(['Premi il citofono. Una voce gracchia:', 'You press the intercom. A voice crackles:'])); npc(t(['Citofono', 'Intercom']), 'Club Radioamatori. Solo soci, mi spiace. Se sei con Mirco, manda lui: ha la chiave.', 'Radio Club. Members only, sorry. If you are with Mirco, send him: he has a key.'); return; }\n  if (S.room === 'fiera'){ npc(t(['Guardia', 'Guard']), 'Non serve bussare: serve il pass.', \"No need to knock: you need a pass.\"); return; }\n  say(t(['Non c\\'\u00e8 niente da suonare qui.', 'There is nothing to ring here.']));\n}\nfunction pullCord(){\n  if (S.room !== 'casa'){ say(t(['Qui non c\\'\u00e8 nessuna corda.', 'There is no cord here.'])); return; }\n  if (S.f.hatch){ say(t(['La botola \u00e8 gi\u00e0 aperta.', 'The trapdoor is already open.'])); return; }\n  S.f.hatch = true;\n  say(t(['Tiri la cordicella: la botola si apre e scende una scaletta di legno.', 'You pull the cord: the trapdoor swings open and a wooden ladder slides down.']));\n  npc(t(['Signora Bertoni', 'Mrs Bertoni']), 'Le cose di Franco sono tutte lass\u00f9. Attento, la luce della soffitta non funziona da anni.', \"Franco's things are all up there. Careful, the attic light hasn't worked for years.\");\n}\nfunction search(fx, it){\n  var r = S.room;\n  if (r === 'vicolo'){\n    if (S.f.pushed){ say(here('vcr') ? t(['Il videoregistratore \u00e8 l\u00ec, dietro il cassonetto.', 'The VCR is right there, behind the dumpster.']) : t(['Dietro il cassonetto non c\\'\u00e8 pi\u00f9 niente.', 'There is nothing else behind the dumpster.'])); return; }\n    say(t(['Frughi intorno al cassonetto. Nella fessura tra il cassonetto e il muro intravedi una scatola nera con dei tasti... ma \u00e8 incastrata: il cassonetto \u00e8 troppo vicino al muro.', 'You poke around the dumpster. In the gap between it and the wall you glimpse a black box with buttons... but it is wedged in: the dumpster is too close to the wall.'])); return;\n  }\n  if (r === 'parco'){\n    if (S.f.note){ say(t(['Sotto la panchina ormai ci sono solo foglie.', 'Only leaves under the bench now.'])); return; }\n    S.f.note = true; S.loc.banconota = 'parco';\n    say(t(['Andrea ha l\\'occhio lungo: sotto la panchina, tra le foglie, spunta una banconota da 5 euro!', 'Andrea has a sharp eye: under the bench, among the leaves, there is a 5-euro note!'])); return;\n  }\n  if (r === 'stazione'){\n    if (S.f.mag){ say(t(['Sotto le panche non c\\'\u00e8 altro.', 'Nothing else under the benches.'])); return; }\n    S.f.mag = true; S.loc.rivista = 'stazione';\n    say(t(['Ti chini a guardare sotto le panche della sala d\\'attesa. Qualcuno ha dimenticato una rivista: Commodore Computer Club, numero 1!', 'You crouch to look under the waiting-room benches. Someone has left a magazine behind: Commodore Computer Club, issue 1!'])); return;\n  }\n  if (r === 'soffitta'){ say(S.f.box ? t(['Hai gi\u00e0 trovato quello che c\\'era di interessante.', \"You've already found what was worth finding.\"]) : t(['Gli scatoloni sono pieni di carte. Quello con scritto FRANCO - LAVORO sembra il pi\u00f9 promettente: \u00e8 ancora chiuso.', 'The boxes are full of papers. The one marked FRANCO - WORK looks the most promising: it is still closed.'])); return; }\n  if (r === 'lab'){ say(S.f.drawer ? t(['Nel laboratorio ormai conosci ogni angolo.', 'By now you know every corner of the workshop.']) : t(['Sul banco non c\\'\u00e8 niente che ti serva. Ma il cassetto non l\\'hai ancora aperto.', \"There's nothing you need on the bench. But you haven't opened the drawer yet.\"])); return; }\n  if (r === 'gino'){ npc('Gino', 'Se cerchi qualcosa di preciso, chiedi! Ho pi\u00f9 roba sotto il banco che sopra.', 'If you want something in particular, just ask! I keep more under the counter than on it.'); return; }\n  if (r === 'shop'){ say(t(['Nella cesta delle occasioni ci sono decine di EPROM 27C010 a 5 euro.', 'The bargain bin holds dozens of 27C010 EPROMs at 5 euros.'])); return; }\n  if (r === 'fiera'){ say(t(['Fuori dall\\'ingresso c\\'\u00e8 solo il manifesto con l\\'elenco degli stand.', 'Outside the entrance there is only the poster listing the stands.'])); return; }\n  if (r === 'bar'){ say(t(['Tra i tavolini trovi solo briciole e la Gazzetta di Valdora.', 'Among the tables you find only crumbs and the Valdora Gazette.'])); return; }\n  say(t(['Cerchi con attenzione, ma qui non c\\'\u00e8 niente di utile.', 'You search carefully, but there is nothing useful here.']));\n}\nfunction buyEprom(){\n  if (has('eprom') || S.mh.indexOf('eprom') >= 0 || S.inst.rom){ npc('Fabbri', 'Una ti basta, no?', \"One's enough, isn't it?\"); return; }\n  if (!has('banconota')){ npc('Fabbri', 'Cinque euro l\\'una. Torna quando hai i soldi, ragazzo.', 'Five euros each. Come back when you have the money, lad.'); return; }\n  S.loc.banconota = null; S.loc.eprom = 'inv';\n  say(t(['Dai la banconota a Fabbri e lui ti mette in mano una EPROM 27C010 nuova.', 'You hand Fabbri the note and he gives you a brand-new 27C010 EPROM.']));\n  npc('Fabbri', 'Per il C65 di Mirco? Salutamelo!', \"For Mirco's C65? Say hello to him for me!\");\n  addPts(5);\n}\nfunction powerOn(){\n  if (S.room !== 'lab'){ say(t(['Il computer \u00e8 in laboratorio.', 'The computer is in the workshop.'])); return; }\n  if (!allDone()){ say(t(['Premi l\\'interruttore...', 'You flip the switch...'])); say(c65Text()); if (S.m.where === 'lab') hint(); return; }\n  S.over = true;\n  say(t(['Premi l\\'interruttore. Il drive fa un piccolo scatto, il floppy gira con la cinghia nuova, e sul monitor appare la schermata di avvio. Dall\\'altoparlante escono le note dei due SID, insieme.', 'You flip the switch. The drive clicks, the floppy spins on its new belt and the boot screen appears on the monitor. Both SIDs sing out of the speaker together.']));\n  npc('Mirco', 'Ce l\\'abbiamo fatta, Andrea. Tu trovi, io aggiusto: siamo imbattibili!', 'We did it, Andrea. You find, I fix: nobody can beat us!');\n  addPts(5);\n  say(t(['FINE. Hai completato \u00abC65 - Il prototipo perduto\u00bb con ' + S.score + ' punti su 100 in ' + (S.moves + 1) + ' mosse. Scrivi RICOMINCIA per giocare di nuovo.', 'THE END. You finished \u201cC65 - The Lost Prototype\u201d with ' + S.score + ' points out of 100 in ' + (S.moves + 1) + ' moves. Type RESTART to play again.']), 'win');\n  persist(false);\n}\nfunction talkMirco(){\n  if (!has('radio') && !(S.room === 'lab' && S.m.where === 'lab')){ say(t(['Senza ricetrasmittente non puoi parlare con Mirco da qui.', \"Without the walkie-talkie you can't talk to Mirco from here.\"])); return; }\n  hint();\n}\nfunction topicOf(rest){\n  var s = ' ' + rest.join(' ') + ' ';\n  if (\/ (fiera|expo|stand|rossi|cavo|fair|cable|show) \/.test(s) && \/ (vai|andare|va|corri|go|going|get|prendi|prendere|fetch|cerca|cercare|look|find|bring) \/.test(s)) return 'fiera';\n  if (\/ (club|programma|programmare|programmatore|masterizza|program|programmer|burn|radioamatori) \/.test(s)) return 'club';\n  if (\/ (fiera|expo|fair) \/.test(s)) return 'fiera';\n  return null;\n}\nfunction talk(who, rest, v){\n  if (who === 'mirco'){\n    if (!has('radio') && !(S.room === 'lab' && S.m.where === 'lab')){ say(t(['Senza ricetrasmittente non puoi parlare con Mirco da qui.', \"Without the walkie-talkie you can't talk to Mirco from here.\"])); return; }\n    var tp = topicOf(rest);\n    if (tp) return errand(tp);\n    return hint();\n  }\n  if (!npcHere(who)){ say(t(['Qui non c\\'\u00e8 nessuno con quel nome.', 'There is nobody by that name here.'])); return; }\n  var s = ' ' + rest.join(' ') + ' ';\n  switch (who){\n  case 'gino':\n    if (S.f.swapped) return npc('Gino', 'Grazie ancora per la rivista, Andrea. La incornicio!', \"Thanks again for the magazine, Andrea. I'm framing it!\");\n    setStand();\n    return npc('Gino', 'Ciao Andrea! Cavi strani per prototipi? C\\'\u00e8 solo Rossi, stand 23 alla Retro Expo. Un\\'altra cosa: sotto il banco ho una scheda di C64C morta, con tutti i chip. Te la do in cambio del numero 1 di Commodore Computer Club: mi manca da trent\\'anni.',\n      \"Hi Andrea! Weird cables for prototypes? Only Rossi has those, stand 23 at the Retro Expo. Another thing: under the counter I've got a dead C64C board, chips and all. It's yours in exchange for issue 1 of Commodore Computer Club: I've been missing it for thirty years.\");\n  case 'rita':\n    return npc('Rita', 'Cerchi pezzi di computer? Gino al mercatino ha un banco pieno di quella roba. E se cerchi roba davvero vecchia chiedi a Nonno Pino, l\u00ec in fondo: si ricorda tutto.', 'Looking for computer parts? Gino at the market has a stall full of that stuff. And if you want really old things, ask Grandpa Pino at the back: he remembers everything.');\n  case 'pino':\n    return npc(t(['Nonno Pino', 'Grandpa Pino']), 'Un Commodore 65? Ah, Franco Bertoni... abitava in Viale dei Tigli. Lavorava in Germania, alla Commodore, e quando chiusero torn\u00f2 con le valigie piene di dischetti. La moglie \u00e8 ancora l\u00ec, ma non apre agli sconosciuti: portale qualcosa che le parli di lui.',\n      \"A Commodore 65? Ah, Franco Bertoni... he lived on Viale dei Tigli. He worked in Germany, for Commodore, and when they closed he came back with suitcases full of floppies. His wife still lives there, but she doesn't open up to strangers: bring her something that speaks to her of him.\");\n  case 'fabbri':\n    return npc('Fabbri', 'Le EPROM sono nella cesta delle occasioni: 27C010, cinque euro l\\'una.', '27C010 EPROMs are in the bargain bin: five euros each.');\n  case 'signora':\n    if (S.room === 'viale') return npc(t(['Signora Bertoni', 'Mrs Bertoni']), 'Mio marito? Franco non c\\'\u00e8 pi\u00f9 da tanti anni. Perch\u00e9 dovrei fidarmi di lei?', \"My husband? Franco passed away many years ago. Why should I trust you?\");\n    if (S.f.box) return npc(t(['Signora Bertoni', 'Mrs Bertoni']), 'Trovato qualcosa lass\u00f9? Franco diceva sempre che quel dischetto valeva pi\u00f9 della macchina.', 'Did you find anything up there? Franco always said that floppy was worth more than the car.');\n    return npc(t(['Signora Bertoni', 'Mrs Bertoni']), 'Franco lavorava al Commodore 65, sa? Poi chiusero tutto e non lo vendettero mai. Le sue cose sono in soffitta: tiri la cordicella della botola.', 'Franco worked on the Commodore 65, you know. Then they shut everything down and it was never sold. His things are in the attic: pull the trapdoor cord.');\n  case 'guardia':\n    return npc(t(['Guardia', 'Guard']), 'Oggi solo espositori con il pass. Lei ce l\\'ha? No? Allora torni domani.', \"Exhibitors with a pass only today. Have you got one? No? Then come back tomorrow.\");\n  }\n}\nfunction give(it, who){\n  if (who === 'mirco'){\n    if (!(S.room === 'lab' && S.m.where === 'lab')){\n      if (S.m.where !== 'lab') say(t(['Mirco non \u00e8 in laboratorio in questo momento.', \"Mirco isn't in the workshop right now.\"]));\n      else say(t(['Mirco \u00e8 in laboratorio: per dargli qualcosa devi portarglielo. La ricetrasmittente trasmette la voce, non i pezzi!', \"Mirco is in the workshop: to give him something you have to take it there. The walkie-talkie carries voices, not parts!\"]));\n      return;\n    }\n    if (it === 'vcr'){\n      S.loc.vcr = null; S.inst.fuse = true;\n      say(t(['Mirco smonta il videoregistratore in tre minuti esatti.', 'Mirco takes the VCR apart in exactly three minutes.']));\n      mirco('Fusibile ritardato da 1,6 A, identico! E questa cinghia va a pennello per il floppy. Vediamo... il LED si accende!', 'A 1.6 A slow-blow fuse, identical! And this belt is just right for the floppy. Let\\'s see... the LED comes on!');\n      addPts(15); hint(); checkReady(); return;\n    }\n    if (it === 'eprom' || it === 'floppy'){\n      S.loc[it] = null; S.mh.push(it);\n      mirco(it === 'eprom' ? 'Una 27C010 nuova, perfetta.' : 'Il dump della ROM 910111! Questo \u00e8 oro, Andrea.', it === 'eprom' ? 'A brand-new 27C010, perfect.' : 'A dump of ROM 910111! This is gold, Andrea.');\n      if (S.mh.indexOf('eprom') >= 0 && S.mh.indexOf('floppy') >= 0) mirco('Ora ho tutto. Il programmatore \u00e8 al Club Radioamatori: dimmi di andare al club e ci vado.', 'Now I have everything. The programmer is at the Radio Club: tell me to go to the club and I\\'ll go.');\n      return;\n    }\n    if (it === 'scheda'){\n      S.loc.scheda = null; S.inst.sid = true;\n      say(t(['Mirco accende la stazione dissaldante, toglie il SID 8580 dalla scheda del C64C e lo infila nello zoccolo vuoto del C65.', 'Mirco fires up the desoldering station, pulls the 8580 SID off the C64C board and pushes it into the empty socket of the C65.']));\n      mirco('Due SID che suonano insieme. Musica!', 'Two SIDs playing together. Music!');\n      addPts(15); checkReady(); return;\n    }\n    if (it === 'rivista'){ mirco('Bella! Ma Gino la cerca da trent\\'anni: scambiala con lui, ci far\u00e0 un affare.', \"Nice! But Gino has been after that for thirty years: swap it with him, he'll make it worth your while.\"); return; }\n    if (it === 'foto'){ mirco('Tienila tu, magari ti serve per farti aprire qualche porta.', 'You keep it, it might help you get a door or two opened.'); return; }\n    if (it === 'biglietto'){ mirco('\u00abA chi riuscir\u00e0 a farlo ripartire\u00bb... allora tocca proprio a noi!', '\u201cTo whoever manages to get it running again\u201d... well, that has to be us!'); return; }\n    mirco('Non mi serve, grazie. Tienilo tu.', \"I don't need that, thanks. You keep it.\");\n    return;\n  }\n  if (who === 'signora' && S.room === 'viale' && !S.f.rang){ say(t(['La porta \u00e8 chiusa. Prima suona il campanello.', 'The door is shut. Ring the bell first.'])); return; }\n  if (!npcHere(who)){ say(t(['Qui non c\\'\u00e8.', \"They aren't here.\"])); return; }\n  if (who === 'gino'){\n    if (it === 'rivista'){\n      S.loc.rivista = null; S.loc.scheda = 'inv'; S.f.swapped = true;\n      npc('Gino', 'Il numero 1! Andrea, sei un mago. Affare fatto: ecco la scheda del C64C, il SID \u00e8 ancora sopra.', 'Issue 1! Andrea, you are a wizard. Deal: here is the C64C board, the SID is still on it.');\n      return;\n    }\n    return npc('Gino', 'Bello, ma non mi interessa. A me manca solo il numero 1 di Commodore Computer Club.', \"Nice, but I'm not interested. The only thing I'm missing is issue 1 of Commodore Computer Club.\");\n  }\n  if (who === 'signora'){\n    if (it === 'foto' && !S.f.door){\n      S.f.door = true; S.loc.foto = 'inv';\n      say(t(['Le porgi la polaroid attraverso lo spiraglio. La signora la guarda a lungo, poi toglie la catenella.', 'You pass the Polaroid through the gap. The lady looks at it for a long time, then takes off the chain.']));\n      npc(t(['Signora Bertoni', 'Mrs Bertoni']), 'Questo... \u00e8 il computer di Franco. Ci ha lavorato due anni, in Germania. Entri, entri pure.', \"This... is Franco's computer. He worked on it for two years, in Germany. Come in, do come in.\");\n      S.room = 'casa'; showRoom(); return;\n    }\n    return npc(t(['Signora Bertoni', 'Mrs Bertoni']), 'No, grazie, caro.', 'No, thank you, dear.');\n  }\n  if (who === 'fabbri'){ if (it === 'banconota') return buyEprom(); return npc('Fabbri', 'Qui si vende, mica si compra l\\'usato!', 'I sell things here, I don\\'t buy second-hand!'); }\n  if (who === 'guardia') return npc(t(['Guardia', 'Guard']), 'Gentile, ma senza pass non si entra.', \"Kind of you, but no pass, no entry.\");\n  if (who === 'rita' || who === 'pino') return npc(who === 'rita' ? 'Rita' : t(['Nonno Pino', 'Grandpa Pino']), 'Tienilo tu, a me non serve.', \"You keep it, I've no use for it.\");\n}\n\n\/* ---------- avvio ---------- *\/\nfunction intro(){\n  say(t(['C65 - IL PROTOTIPO PERDUTO', 'C65 - THE LOST PROTOTYPE']), 'win');\n  say(t([\"Valdora, sabato mattina. Mirco ha trovato in una cantina un prototipo di Commodore 65: un computer che la Commodore non mise mai in vendita e di cui esistono pochissimi esemplari. Il problema? Non si accende.\\nMirco \u00e8 il riparatore. Tu sei Andrea: se in citt\u00e0 c'\u00e8 un pezzo da trovare, lo trovi tu. Mirco resta in laboratorio con il saldatore, ma avete una ricetrasmittente a testa.\\nScrivi AIUTO per l'elenco dei comandi.\",\n    \"Valdora, Saturday morning. Mirco has found a Commodore 65 prototype in a cellar: a computer Commodore never put on sale, with only a handful of examples left. The problem? It won't power up.\\nMirco is the repairer. You are Andrea: if there's a part to be found in town, you'll find it. Mirco stays in the workshop with his soldering iron, but you each have a walkie-talkie.\\nType HELP for the list of commands.\"]));\n  showRoom();\n}\n\n[].forEach.call(root.querySelectorAll('[data-t]'), function(el){ var k = el.getAttribute('data-t'); if (UI[k]) el.textContent = t(UI[k]); });\nroot.querySelector('.inv').setAttribute('data-empty', t(UI.empty));\n[].forEach.call(root.querySelectorAll('.pad [data-d]'), function(b){ var d = b.getAttribute('data-d'); b.textContent = t(DIRN[d]); b.addEventListener('click', function(){ submit(t(DCMD[d])); }); });\n[].forEach.call(root.querySelectorAll('[data-c]'), function(b){ var c = b.getAttribute('data-c'); if (QUICK[c]) b.textContent = t(QUICK[c]); b.addEventListener('click', function(){ submit(t(QCMD[c])); }); });\n\nvar hist = [], hi = 0;\nfunction submit(txt){ hist.push(txt); hi = hist.length; run(txt); }\nroot.querySelector('form').addEventListener('submit', function(e){ e.preventDefault(); var v = input.value.trim(); input.value = ''; if (v) submit(v); });\ninput.addEventListener('keydown', function(e){\n  if (e.key === 'ArrowUp' && hi > 0){ hi--; input.value = hist[hi]; e.preventDefault(); }\n  else if (e.key === 'ArrowDown'){ hi = Math.min(hist.length, hi + 1); input.value = hist[hi] || ''; e.preventDefault(); }\n});\n\nS = fresh();\nintro();\nvar saved = null; try { saved = localStorage.getItem(KEY); } catch(e){}\nif (saved) say(t(['C\\'\u00e8 una partita salvata su questo browser: scrivi CARICA per riprenderla.', 'There is a saved game in this browser: type LOAD to pick it up again.']), 'sys');\nroot._run = run; root._state = function(){ return S; };\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>C65 ? &gt; Mirco PWRVIDEOROMSID<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-11545","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/11545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/comments?post=11545"}],"version-history":[{"count":3,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/11545\/revisions"}],"predecessor-version":[{"id":11548,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/11545\/revisions\/11548"}],"wp:attachment":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/media?parent=11545"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/categories?post=11545"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/tags?post=11545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}