function rnd(x) { return Math.floor(Math.random() * x); } // Main node Class function N(text) { if (text == undefined) throw "Only text allowed in text" this.text = text; this.next = new Array(); // Add one element to the next node array // Return none to avoid an addition if used as N argument! this.push_next = function(x) { this.next.push(x); return undefined; } // Set the next node. Only if they belong to the same type of object for (i = 1; i < arguments.length; i++) { var x = arguments[i]; if (x == undefined || x.prototype != this.prototype) continue; this.push_next(x); } // Get random next node this.get_next = function() { var r = rnd(this.next.length); return this.next.length == 0 ? undefined : this.next[r]; } // Create a similar node with the same followers this.similar = function(txt) { var w = new N(txt); for (var i = 0; i < this.next.length; i++) w.next[i] = this.next[i]; return w; } } // Build up the tree var f = new N("A Föld", new N("elég, eljegesedik, vagy a Napba zuhan", new N("és mindenki meghal."), new N("és majdnem mindenki meghal.") ), new N("_et eltalálja egy gigantikus üstökös és", new N("megsemmisíti."), new N("megmenti."), new N("nem semmisíti meg, de", new N("mindenki meghal."), new N("majdnem mindenki meghal.") ) ), new N("[ctrlPLURAL]", // Set if there are multiple beings new N("[ctrlOBJECT]", // Being are objects new N("tudósai", f2 = new N("felfedeznek", f1 = new N("[PLURAL:egy :]parányi", f3 = new N("rovar[BOTH::t:ok:okat]", new N("_, amely[PLURAL::ek]", f5 = new N("asszonyainkat akarj[PLURAL:a:ák]", new N("és", f7 = new N("", new N("rádióaktív[PLURAL::ak] és", new N("megsemmisítheti[PLURAL:: őket]", new N("egy csapat fáklyás paraszt."), new N("a hadsereg, a haditengerészet, a légierő és/vagy a parti őrség."), new N("az atombomba.") ), new N("nem semmisítheti meg[PLURAL:: őket]", f8 = new N("az atombomba", f9 = new N("_, de", fA = new N("egy értelmes gyerek elmagyarázza neki[PLURAL::k], hogy az emberiség O.K.", new N("és meghal[PLURAL::nak]."), new N("és elhagyj[PLURAL:a:ák] a Földet."), new N("és förtelmes nyálkás kupaccá változ[PLURAL:i:na]k.") ), fA.similar("egy pap elmeséli nekik, hogy van Isten"), fB = fA.similar("beleszeret[PLURAL::nek] egy csinos lányba"), new N("bárányhimlőben elpusztul[PLURAL::nak]."), fB.push_next(new N("és összeházasodnak és boldogok és ma is élnek, ha meg nem haltak.")) ), new N("_. Mire a tudósok kidolgoznak egy fegyvert, amely", new N("megöli[PLURAL:: őket]."), new N("förtelmes nyálkás kupaccá változtatja[PLURAL:: őket]."), fC = new N("hatástalannak bizonyul", new N("és megsemmisít[PLURAL::enek] bennünket."), new N("és tűrhető diktatatúráj[PLURAL:a:uk] alá vet[PLURAL::nek] bennünket."), new N("és felfal[PLURAL::nak] bennünket.") ), fC.push_next(f9) ) ), f8.similar("a hadsereg, a haditengerészet, a légierő és/vagy a parti őrség"), f8.similar("egy csapat fáklyás paraszt") ) ) ), f7.similar("nem") ) ), new N("barátságos[PLURAL::ak]."), f5.similar("barátságos[PLURAL::ak], de félreértik ő[PLURAL::ke]t"), f5.similar("félreért[PLURAL::enek] bennünket"), f5.similar("csak jót akar[PLURAL::nak] nekünk"), f6 = f5.similar("kizárólag élelmiszernek tekint[PLURAL::enek] bennünket"), f5.push_next(new N("_. Néhányat mag[PLURAL:ával:ukkal] visz[PLURAL::nek] és elhagyj[PLURAL:a:ák] a Földet.")), f6.push_next(new N("és felfal[PLURAL::nak].")) ) ), f3.similar("gyík[BOTH::ot:ok:okat]"), f3.similar("harci gép[BOTH::et:ek:eket]"), f3.similar("szuperlény[BOTH::t:ek:eket]"), f3.similar("meghatározhatatlan életform[BOTH:a:át:ák:ákat]") ), f1.similar("[PLURAL:egy :]óriási") ), f2.similar("feltalálnak") ) ), new N("_et megtámadj[PLURAL:a:ák]", f4 = new N("[PLURAL:egy :]parányi", f1.similar("Marsról, Holdról, Betelgeuzéről, más galaxisról származó") ), f4.similar("[PLURAL:egy :]óriási") ) ) ); // Control flow Class function CTRL() { this.ctrlPLURAL = function() { this.PLURAL = rnd(2); this.BOTH |= this.PLURAL * 2; } this.ctrlOBJECT = function() { this.OBJECT = 1; this.BOTH |= 1; } } // Create a novel from f function Novel() { var h = new CTRL(); var txt = new Array(); for(var i = f; typeof i != 'undefined'; i = i.get_next()) { var t = i.text; while (1) { var p = t.indexOf("["); if (p == -1) break; var p1 = t.indexOf("]"); if (p1 == -1) throw "Missing ']'"; var arr = t.substring(p + 1, p1).split(":"); var ctrl = arr.shift(); if(h[ctrl] == undefined) throw "No such control exists as " + ctrl; var repl = ""; if (arr.length == 0) { h[ctrl](); } else { repl = arr[h[ctrl]]; } t = t.substring(0, p) + repl + t.substr(p1 + 1); } if (t > "") txt.push(t); } text = txt.join(" ").replace(/ _/g, ""); return text + " VÉGE"; } // Create 5 unique novels var novel_no = 5; var novel = new Array(); for(var i = 0; i < novel_no; i++) { novel.unshift(Novel()); do { for (j = 1; j < novel.length; j++) if(novel[0] == novel[j]) { novel[0] = Novel(); break; } } while(j < novel.length); } for(var i = 0; i < novel.length; i++) novel[i] = '
  • ' + novel[i] + '
  • '; document.writeln('
      ' + novel.join('\n') + '
    ');