xxxxxxxxxx
792
/*
RadicalOregonTrail
idea: sonja & rené
*/
/*
Architecture:
Array Quests
Quest: name, text
- Reaction (1-n) objectname,objectcategory,reactiontext
- More than one reaction with object possible > random
Inventory: Options (selected)
< 3 Quests : Story break
= 3 Quests : end of story
*/
// starting point for P5JS
var button;
var myTextArea;
var speedStory = 750;
/*
QUESTS
*/
var questX;
var optionX;
var divSelection;
var arrPredefinedQuests = [0,1,2,3,-1];
var selectedObjectIndex = -1;
var selectedObjectInfoText = "Ein Apfel.<br>";
var selectedObjectName = "";
var tryOuts = 0;
var storyState = 1; // active
var indexEndStoryDone = 0;
// geschafft
var arrDone = ["'Gut sind sie da Minister.'","'Einen schönen Tag, Mr. Ermotti'","'Guten morgen Herr Musk. Ihre Crew wartet in Zimmer 15'","'Fuck, warum kommst du wieder zu spät?'","'Da wartet ein Typ in deinem Büro, er sieht seltsam aus.'","'Godzilla, tob nicht so rum!'","'Wo haben wir den Toten gefunden?'","'Seid ihr sicher, dass wir das Geld nicht hinterzogen haben?'"];
/*
QUEST CLASSES
*/
var quests = [];
function addQuest(name, text) {
var newQuest = new Quest(name,text);
quests[quests.length] = newQuest;
return newQuest;
}
function getOption( index ) {
var obj;
var counter = 0;
for (var h=0;h < quests.length;h++) {
obj = quests[h];
var arrOptions = obj.getOptions();
// console.log(arrOptions);
for (v=0;v<arrOptions.length;v++) {
var optX = arrOptions[v];
if (index==counter) return optX;
counter++;
}
}
}
function getAllOptions() {
var arrayObjects = [];
var obj;
for (var h=0;h < quests.length;h++) {
obj = quests[h];
// console.log("quests: "+h );
// console.log(obj);
var arrOptions = obj.getOptions();
// console.log(arrOptions);
for (v=0;v<arrOptions.length;v++) {
var optX = arrOptions[v];
// console.log("-- options "+v );
arrayObjects[arrayObjects.length] = optX;
}
}
return arrayObjects;
}
function debug() {
// console.log(quests);
}
// CLASSES
class Quest {
constructor(name, text) {
this.name = name;
this.text = text;
this.options = [];
this.end = false;
}
addOption( objectname, objectCategory, objectinfoText /* first only */, reactionText ) {
var reactionX = new Reaction(objectname,objectCategory,objectinfoText, reactionText);
this.options[this.options.length] = reactionX;
return reactionX;
}
getOptions() {
return this.options;
}
}
class Reaction {
constructor(objectName, objectCategory, objectInfo, text) {
this.name = objectName;
this.objectInfo = objectInfo;
this.objectCategory = objectCategory;
this.text = text;
// ..
this.endOfStory = "";
// runtime ...
this.runtimeSelected = false;
this.runtimeActive = false;
/*
this.options = [];
this.end = false;
*/
}
}
// the quests
questX = addQuest("strassekind","Ein Kind steht alleine vor einem Fussgängerstreifen, Autos warten, das Kind will nicht rüber.");
optionX = questX.addOption("Apfel","frucht","Ein Boskop schon mit Schimmel.","Es nimmt deinen Apfel und springt in hohem Boden über die Häuser und schmatzt dazu essend.");
optionX.endOfStory = "end";
optionX.runtimeSelected = true;
optionX = questX.addOption("Holzmaterial","burn","Holz halt.","Das Kind nimmt das Holz geht auf erste Auto zu und vermöbelt es.");
optionX.runtimeSelected = false;
optionX.endOfStory = "end";
optionX = questX.addOption("Apfel","","","Der Apfel bleibt in deiner Tasche. Das Kind fällt vor Erschöpfung um. Die Polizei befragt dich.");
optionX.runtimeSelected = false;
optionX = questX.addOption("else","","","Verdammte Zeiten. Du kannst das Problem nicht lösen. Sonst kannst du das doch immer oder? Das Kind mutiert zum Monster und zerstört das Land.");
optionX.endOfStory = "end";
/*
questX = addQuest("tarzan","Tarzan steht vor dem Coop.");
optionX = questX.addOption("Liane","","Lianen lassen sich überall gut nutzen. Vorallem an Balkonen.","Du gibst ihm die Liane, er schwingt sich rüber");
optionX = questX.addOption("Waffe","","Es ist eine uralte Waffe mit Steinlader.","Due erschiesst den Weissen.");
optionX.endOfStory = "end";
optionX = questX.addOption("Apfel","","Du wirst mit dem Apfel nach ihm. Er weicht aus und küsst dich.");
// optionX.endOfStory = "end";
optionX = questX.addOption("else","","","Eine gute Sache. Du gehst weiter. Kein Interesse.");
*/
questX = addQuest("drogenhaendler","Ein Typ steht am Strassenrand, du siehst ihn an. Er schaut zurück und sagt laut: 'Warum glotzt Du mich so an, sehe ich aus wie Prinz Valium'");
optionX = questX.addOption("Apfel","","","Du ziehst verlegen einen Apfel hervor und schmatzst von dannen.");
optionX = questX.addOption("Waffe","","","Er mag keine Waffen und hechtet auf dich los. Es kommt zum Kampf. Kein Schuss löst sich. Aber du bleibst liegen und der Notarzt muss kommen. Bekommst du Valium?");
optionX.endOfStory = "end";
optionX = questX.addOption("else","","","'ähhh' und du gehst weiter");
questX = addQuest("indernacht","Wieder einmal musst du an einer Tramhaltestelle warten. Da hält ein Typ mit seinem Smart. Er dreht die Scheibe runter und singt laut zu seinem Radio 'Something Stupid' zu dir. (<a href='https://www.youtube.com/watch?v=rehA9X39OP4'>Song</a>). Die Ampel ist nun grün für dich. Er fährt davon. ");
optionX = questX.addOption("Liebe","","","Du gehst hin und küsst ihn.");
optionX.endOfStory = "end";
optionX = questX.addOption("else","","","Du gehst über den Fussgängerstreifen im Kopf 'I love you'.");
questX = addQuest("autos","Die Autos stehen so schön entlang der Strasse. Andere Autos stehen auf der Strasse, es ist 36 Grad warm. ");
optionX = questX.addOption("Liane","","","Du nimmst die Liane und versucht die Liane in Sprit zu verwandeltn, dass du die Klimaanlage betreiben kannst.");
optionX = questX.addOption("Apfel","","","Der Apfel hilft. Es ist einen Moment richtig nass in deinem Mund.");
optionX = questX.addOption("else","","","Ist doch super, geht unser Planet an den Arsch. Weiter so. Schuld sind immer die anderen! Die Ausländer meint die SVP.");
optionX = questX.addOption("Baseballschläger","","Ein richtig guter Baseballschläger. Hilft überall ausser im Sport.","Du beginnst auf die stehenden und leeren Autos einzuschlagen. In deinem Kopf siehst du Pippi im Kunsthaus.");
optionX.endOfStory = "end";
questX = addQuest("zureich","Die Stadt brennt, es ist Zürich. Es ist wie immer in den letzten Tagen.");
optionX = questX.addOption("Apfel","frucht","","Der Apfel steht und fällt sofort. Er wächst und zerstört den Zankapfel Zürich.");
optionX.endOfStory = "end";
optionX = questX.addOption("Orange","frucht","Typische Kolonialfrucht.","Die Orange löscht es sofort.");
optionX = questX.addOption("else","","","Pech für die Stadt. Du musst eh nicht dahin.");
questX = addQuest("mutterkind","Ein Kind mit blonder Mutter ist unterwegs. Es täubelt wie wild. Die Mutter.");
optionX = questX.addOption("Orange","frucht","","Ich nehme nichts von fremden Menschen. Die Polizei kommt");
optionX = questX.addOption("else","","","Du lässt sie in Ruhe täubeln.Der Hund der Familie wird unabhängig davon zum grössten Diktator* der Welt.");
optionX.endOfStory = "end";
optionX = questX.addOption("Liebe","","","Wo ist eigentlich der Vater? Die Frage hättest du nicht stellen sollen.");
// optionen never used
questX = addQuest("notused","container");
optionX = questX.addOption("Tasse","","Eine Tasse mit einem Logo der Sendung mit der Maus.","");
optionX = questX.addOption("Liebe","","Hilft immer.","");
optionX = questX.addOption("Hass","","Hilft immer mehr.","");
debug();
function setup() {
noCanvas();
let css = createDiv("<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css' integrity='sha512-z3gLpd7yknf1YoNbCzqRKc4qyor8gaKU1qmn+CShxbuBusANI9QpRohGBreCFkKxLhei6S9CQXFEbbKuqLg0DA==' crossorigin='anonymous' referrerpolicy='no-referrer' />");
let divClaim = createDiv("<i >Ein Spiel entlang des täglichen Wahnsinns. <a href='"+document.location.href+"'> Einen anderen Tag. Bitte Gott! </a></i><br>");
let divTitle = createDiv("<h1><i class='fa fa-home' aria-hidden='true'></i> AUF ZUR ARBEIT </H1>");
// let divContentT = createDiv("<div class='introtext'> <a hre='https://www.heise.de?reload'><i class='fa-solid fa-calendar-days'></i> ANOTHER DAY</a> <br></div>"); // .size(100, 100);
let divContent = createDiv("<div class='introtext'></div> Du bist noch zu hause und kramst die Sachen zusammen. Was packst du ein in deine FREITAG-Tasche? Es passen nur 3 stylige Dinge rein. Etwas musst Du mitnehmen, da sonst deine Tasche so leer aussieht und das nicht cool ist.<br>"); // .size(100, 100);
divSelection = createDiv("Selection");
createSelection();
let textdiv = createDiv('<br>Heute schaffst du den beschwerlichen Weg zur Arbeit. Im Fenster siehst du:');
// arrPredefinedQuests = [2,1,0,3,-1];
var arrAll = [];
for (var z=0;z<quests.length;z++) {
arrAll[z] = 1;
}
// find stories
var countStory = 0;
// if (false)
do {
var found = false;
do {
var ii = Math.floor(random(0,quests.length-1));
if (arrAll[ii] ==1) {
arrPredefinedQuests[countStory]=ii;
arrAll[ii] = 0;
break;
}
} while(!found);
countStory++;
} while(countStory<3);
// quests
var indexX = arrPredefinedQuests[0];
var storyObj = quests[indexX];
divContent = createDiv(""); // .size(100, 100);
divContent.html("<div class='storytext' style='margin: 10px; opacity: 0.3;'>"+storyObj.text+"</div>");
// setup
indexEndStoryDone = Math.floor(random(0,arrDone.length));
button = createButton("<i class='fa fa-sign-out' aria-hidden='true'></i> Dann geh ich mal!");
button.mousePressed(letsGo);
}
function clearStoryDivs() {
for (var z=0;z<arrContentDivs.length;z++) {
var divx = arrContentDivs[z];
divx.remove();
}
}
var arrContentDivs = [];
// StepByStep
var timer;
function letsGo() {
lgStep1();
}
var psCounter = 0;
function lgStep1() {
clearStoryDivs();
// selected
var invcount = 0;
var arrOptionsX = getAllOptions();
for (var a=0;a<arrOptionsX.length;a++) {
var optionX = arrOptionsX[a ];
// check selected options
if (optionX.runtimeSelected) {
invcount++;
}
}
if (invcount==0) {
alert("Du brauchst einen Gegenstand in der Tasche.\n(Lesen lernt man in der ersten Klasse)");
return;
}
// alert("Let'sgo ");
let divContent = createDiv(""); // .size(100, 100);
divContent.html("<h2>Auf dem Weg</h2>"); // (storyCounter+1) // <h3>Auf dem Weg <h3>
arrContentDivs[arrContentDivs.length] = divContent;
tryOuts++;
storyCounter = 0;
stepState = 0; // 0 - 3
stepStoryIndex = 0; // Index
storyState = 1;
// copy all states
var objectLists = getAllOptions();
for (var t=0;t<objectLists.length;t++) {
var optXXX = objectLists[t ];
optXXX.runtimeActive = optXXX.runtimeSelected;
}
setTimeout(lgStep2, speedStory);
}
function lgStep2() {
console.log("lgStep2() ");
psCounter = 0;
setTimeout(lgStep3, speedStory);
}
function lgStep3() {
console.log("lgStep3() ");
var forwardToNoFuture = true;
processStory();
scrollToBottom();
psCounter++;
if (psCounter<3) setTimeout(lgStep3, speedStory);
if (psCounter==3) {
if (storyState==0) setTimeout(lgStep4, speedStory);
if (storyState==1) {
if (stepStoryIndex!=3) setTimeout(lgStep2, speedStory);
if (stepStoryIndex==3) setTimeout(lgStep4, speedStory);
}
}
}
// end ...
function lgStep4() {
scrollToBottom();
// story endet hier
if (storyState==0) {
let divContent = createDiv(""); // .size(100, 100);
divContent.html(divContent.html()+"<h4>Leider endet die Geschichte hier. </h4><br> ");
arrContentDivs[arrContentDivs.length] = divContent;
} else {
var txt = arrDone[indexEndStoryDone];
let divContent = createDiv(""); // .size(100, 100);
divContent.html("Bei der Arbeit begrüsst man dich mit "+txt);
arrContentDivs[arrContentDivs.length] = divContent;
divContent = createDiv(""); // .size(100, 100);
divContent.html("<h4>Ende der heutigen Geschichte</h4>");
arrContentDivs[arrContentDivs.length] = divContent;
}
scrollToBottom();
}
// All in One
function letsGoAllInOne() {
clearStoryDivs();
// selected
var invcount = 0;
var arrOptionsX = getAllOptions();
for (var a=0;a<arrOptionsX.length;a++) {
var optionX = arrOptionsX[a ];
// check selected options
if (optionX.runtimeSelected) {
invcount++;
}
}
if (invcount==0) {
alert("Du brauchst einen Gegenstand in der Tasche.\n(Lesen lernt man in der ersten Klasse)");
return;
}
// alert("Let'sgo ");
let divContent = createDiv(""); // .size(100, 100);
divContent.html("<h2>Auf dem Weg</h2>"); // (storyCounter+1) // <h3>Auf dem Weg <h3>
arrContentDivs[arrContentDivs.length] = divContent;
tryOuts++;
storyCounter = 0;
stepState = 0; // 0 - 3
stepStoryIndex = 0; // Index
storyState = 1;
// copy all states
var objectLists = getAllOptions();
for (var t=0;t<objectLists.length;t++) {
var optXXX = objectLists[t ];
optXXX.runtimeActive = optXXX.runtimeSelected;
}
// --
var forwardToNoFuture = true;
var c = 0;
do {
processStory();
processStory();
processStory();
if (storyState==0) forwardToNoFuture=false;
c++;
if (c>10) break;
if (stepStoryIndex==3) break;
}
while (forwardToNoFuture);
// story endet hier
if (storyState==0) {
let divContent = createDiv(""); // .size(100, 100);
divContent.html(divContent.html()+"<h4>Leider endet die Geschichte hier. </h4><br> ");
arrContentDivs[arrContentDivs.length] = divContent;
} else {
var txt = arrDone[indexEndStoryDone];
let divContent = createDiv(""); // .size(100, 100);
divContent.html("Bei der Arbeit begrüsst man dich mit "+txt);
arrContentDivs[arrContentDivs.length] = divContent;
divContent = createDiv(""); // .size(100, 100);
divContent.html("<h4>Ende der heutigen Geschichte</h4>");
arrContentDivs[arrContentDivs.length] = divContent;
}
}
function createSelection() {
var html = "<div>";
html += "<div style='margin: 20px; opacity: 0.4'><i>"+selectedObjectInfoText+"</i></div>";
html += "<i class='fa fa-shopping-bag' aria-hidden='true'></i> ";
// console.log("createSelection() // getAllOptions ");
var objectLists = getAllOptions();
// create
// objectLists = ["Apfel","holz"];
var count = 0;
var pocket = "";
var actualList = [];
for (var t=0;t<objectLists.length;t++) {
var optX = objectLists[t ];
if (optX.name=="notused") continue;
if (optX.name=="else") continue;
if (count>2) optX.runtimeSelected = false;
var tadd = " style='opacity: 0.3' ";
if (optX.runtimeSelected) {
tadd=" ";
count++;
pocket += " "+optX.name;
}
// in the selection?
var inTheSelection=false;
for (var k=0;k<actualList.length;k++) {
// console.log("list "+k+":"+ actualList[k]+" vs "+optX.name);
if (actualList[k]==optX.name) inTheSelection=true;
}
if (inTheSelection) continue;
actualList[actualList.length] = optX.name;
html += "<button "+tadd+" onClick='optionXSelected("+t +")'>"+optX.name+" <!-- ("+optX.objectInfo+")--></button>";
}
// console.log(actualList);
html += "</div>";
// <i class="fa fa-info-circle" aria-hidden="true"></i>
/*
html += "";
html += "<h3><i class='fa fa-shopping-bag' aria-hidden='true'></i> In der Tasche</h3><div style='margin:30px;'> "+pocket+"</h3>"
html += "</div>";
*/
divSelection.html(html);
return;
}
function optionXSelected( t ) {
// alert("gonow"+t);
clearStoryDivs();
// get object ..
var optionX = getOption(t );
if (optionX!=null) {
optionX.runtimeSelected = !optionX.runtimeSelected;
// alert("found");
selectedObjectInfoText = optionX.objectInfo;
selectedObjectName = optionX.name ;
}
createSelection();
}
// step story
var actStory;
var actStoryEnd;
var elseStory;
var storyCounter = 0; // which story
var stepState = 0; // 0 - 3
var stepStoryIndex = 0; // Index
var processC = 0;
function processStory() {
processC++;
console.log("ProcessStory() "+processC+" "+stepState);
if (stepState==0) {
let divContent = createDiv(""); // .size(100, 100);
divContent.html(""); // (storyCounter+1) // <h3>Auf dem Weg <h3>
storyCounter++;
arrContentDivs[arrContentDivs.length] = divContent;
var storyIndexAct = arrPredefinedQuests[stepStoryIndex];
console.log("ProcessStory() // storyIndexAct "+storyIndexAct+" storyIndexAct "+storyIndexAct);
actStory = quests[storyIndexAct];
stepStoryIndex++;
divContent = createDiv(""); // .size(100, 100);
divContent.html("<div class='storytext'>"+actStory.text+"</div>");
arrContentDivs[arrContentDivs.length] = divContent;
}
if (stepState==1) {
let divContent = createDiv(""); // .size(100, 100);
divContent.html("");
arrContentDivs[arrContentDivs.length] = divContent;
}
// search for something to use in the bucket ...
if (stepState==2) {
var arrOptionsX = actStory.getOptions();
var optionCorrectOption = null;
var arrPossibleAnswers = [];
for (var a=0;a<arrOptionsX.length;a++) {
var optionX = arrOptionsX[a ];
// check selected options
var objectLists = getAllOptions();
for (var t=0;t<objectLists.length;t++) {
var optXXX = objectLists[t ];
if (optXXX.runtimeSelected) {
if (optionX.name=="else") {
elseStory = optionX;
}
if (optionX.name==optXXX.name) {
optionCorrectOption = optionX;
arrPossibleAnswers[arrPossibleAnswers.length] = optionX;
}
}
}
}
// more than one possiblity
console.log("LENGTH: "+arrPossibleAnswers.length);
if (arrPossibleAnswers.length>1) {
// random it ..
optionCorrectOption = arrPossibleAnswers[Math.floor(random(0,arrPossibleAnswers.length)) ];
}
// not found
if (optionCorrectOption==null) {
let divContent = createDiv(""); // .size(100, 100);
// divContent.html("Das wars wohl für heute. Du konntest nicht helfen.");
// storyState = 0;
// take not ...
optionCorrectOption = elseStory;
arrContentDivs[arrContentDivs.length] = divContent;
}
if (optionCorrectOption!=null) {
let divContent = createDiv(""); // .size(100, 100);
// console.log(optionCorrectOption);
// divContent.html(divContent.html()+"<br>// USED "+optionCorrectOption.name);
divContent.html(divContent.html()+"<div class='reaction'> "+optionCorrectOption.text+"</div>");
// pocket
var pocketHtml = "";
var objectLists = getAllOptions();
for (var t=0;t<objectLists.length;t++) {
var optXXX = objectLists[t ];
if (optXXX.runtimeActive) {
pocketHtml += optXXX.name+", ";
}
}
if (pocketHtml!="") pocketHtml = pocketHtml.substring(0,pocketHtml.length-2);
if (pocketHtml!="") {
let divContentX = createDiv(""); // .size(100, 100);
divContentX.html("<div style='opacity: 0.0; _margin-bottom: 30px; '><i class='fa fa-shopping-bag' aria-hidden='true'></i> <i>"+pocketHtml+"</i></div>"); arrContentDivs[arrContentDivs.length] = divContentX;
}
arrContentDivs[arrContentDivs.length] = divContent;
// check
var endItHere = false;
if (optionCorrectOption.endOfStory!="") {
console.log("ProcessStory() // Exit story "+optionCorrectOption.name);
endItHere = true;
storyState = 0;
}
if (endItHere) {
// let divContent = createDiv(""); // .size(100, 100);
// divContent.html(divContent.html()+"<h4>Ende der Geschichte</d></h4>");
// arrContentDivs[arrContentDivs.length] = divContent;
}
}
}
if (stepState==2) {
stepState = -1;
console.log("ProcessStory() // 2 restart "+stepState);
// alert("Start next story");
}
stepState++;
}
function scrollToBottom()
{
var height = document.body.scrollHeight;
window.scroll(0 , height);
}
function draw() {
}