177 lines
4.3 KiB
JavaScript
177 lines
4.3 KiB
JavaScript
// Initial elements the user starts with
|
|
let found = ['Water', 'Earth', 'Fire', 'Air'];
|
|
// Sorted list of elements
|
|
let sortedFound = found;
|
|
// Number of hints available
|
|
let numHints = 1;
|
|
// Next number of milliseconds after start to give new hint at
|
|
let nextHint = 60000;
|
|
// Saved time for cookies
|
|
let savedTime = 0;
|
|
|
|
// Index of selected element
|
|
let curIndex = -1;
|
|
// Scroll offset
|
|
let offset = 0;
|
|
// Whether or not to show the stopwatch
|
|
let showTime = true;
|
|
//
|
|
let clearText = false;
|
|
|
|
function setup() {
|
|
createCanvas(600, 600);
|
|
loadCookie();
|
|
}
|
|
|
|
function draw() {
|
|
// Black background
|
|
background(0);
|
|
if(clearText) {
|
|
noStroke();
|
|
fill(255, 0, 0)
|
|
textSize(22);
|
|
textFont('Calibri');
|
|
textAlign(CENTER, CENTER);
|
|
text('Savedata cleared. Please reload the page.\nIf this was a mistake, press ENTER', width/2, height/2);
|
|
return;
|
|
}
|
|
if(frameCount == 0) {
|
|
foundUpdated();
|
|
}
|
|
|
|
noStroke();
|
|
manageHints();
|
|
drawFound();
|
|
showText();
|
|
}
|
|
|
|
function manageHints() {
|
|
if(numHints < 5) {
|
|
if(realMillis() >= nextHint) {
|
|
numHints++;
|
|
nextHint = realMillis() + 60000;
|
|
saveCookie();
|
|
}
|
|
} else {
|
|
nextHint = realMillis() + 60000;
|
|
}
|
|
}
|
|
|
|
function showText() {
|
|
textSize(18);
|
|
textAlign(CENTER, CENTER);
|
|
// Show number of elements found
|
|
text('Found: ' + found.length + ' / ' + elements.length, 300, 15);
|
|
textAlign(LEFT, CENTER);
|
|
// Show current sorting mode
|
|
text('Sort Mode: ' + getSortModeName(), 3, 585);
|
|
textAlign(RIGHT, CENTER);
|
|
// Show help message
|
|
text('Press Q for Help', 597, 585);
|
|
// Show stopwatch if supposed to
|
|
if(showTime) {
|
|
textAlign(RIGHT, CENTER);
|
|
let min = ('0' + floor(realMillis()/60000)).slice(-2);
|
|
let sec = ('0' + floor((realMillis()/1000)%60)).slice(-2);
|
|
text('Time: ' + min + ':' + sec, 597, 15);
|
|
}
|
|
textAlign(CENTER, CENTER);
|
|
// Show number of hints and time until next hint
|
|
let timeText = (numHints >= 5) ? '' : ' (' + ceil((nextHint - realMillis())/1000) + ' sec)';
|
|
text('Hints: ' + numHints + timeText, 300, 585);
|
|
if(clearText) {
|
|
background(0)
|
|
textAlign(CENTER, CENTER);
|
|
text('Savedata cleared. Please reload the page ');
|
|
}
|
|
}
|
|
|
|
function drawFound() {
|
|
textSize(14);
|
|
textFont('Calibri');
|
|
textAlign(CENTER, CENTER);
|
|
for(let i = 0; i < found.length; i++) {
|
|
// Calculate grid-y coordinate
|
|
let gridy = floor(i / 9) - offset
|
|
// Draw the element at the grid-x and grid-y positions if it's onscreen
|
|
if(gridy >= 0 && gridy < 9)
|
|
drawElement(i % 9, gridy, sortedFound[i]);
|
|
}
|
|
}
|
|
|
|
// Size of elements
|
|
let es = 50;
|
|
function drawElement(x, y, elem) {
|
|
// Calculate real x and y coordinates from grid-x and grid-y
|
|
let realx = x*es*1.25 + es;
|
|
let realy = y*es*1.25 + es;
|
|
// Draw a white circle around the selected element
|
|
if(sortedFound[curIndex] == elem) {
|
|
fill(240);
|
|
ellipse(realx, realy, es*1.1);
|
|
}
|
|
// Draw the element as a colored circle
|
|
fill(getColor(getClass(elem)));
|
|
ellipse(realx, realy, es);
|
|
// Show the name of the element
|
|
fill(255);
|
|
text(elem, realx, realy);
|
|
}
|
|
|
|
// Combine two elements and add the outcome to the found list
|
|
function combine(e1, e2) {
|
|
let e3 = getOutputs(e1, e2);
|
|
if(e3 != null) {
|
|
for(let i = 0; i < e3.length; i++) {
|
|
if(found.indexOf(e3[i]) < 0) {
|
|
found.push(e3[i]);
|
|
}
|
|
}
|
|
}
|
|
foundUpdated();
|
|
}
|
|
|
|
// Convert real-x and real-y to an index. Returns -1 if invalid
|
|
function getIndexOfCoords(x, y) {
|
|
let ex = round((x - es)/(es*1.25));
|
|
let ey = round((y - es)/(es*1.25));
|
|
if(ex < 0 || ey < 0 || ex > 8 || ey > 8) {
|
|
return -1;
|
|
}
|
|
return ex + (ey + offset)*9;
|
|
}
|
|
|
|
// Selects an element that can be used right now
|
|
function getHint() {
|
|
// If all elements have been found
|
|
if(found.length >= elements.length) return false;
|
|
// Select random elements until one works
|
|
let e1 = random(found);
|
|
while(true) {
|
|
// Go through each of the elements
|
|
for(let i = 0; i < found.length; i++) {
|
|
let outputs = getOutputs(e1, found[i]);
|
|
let hasOutput = false;
|
|
for(let i = 0; outputs != null && i < outputs.length; i++) {
|
|
if(found.indexOf(outputs[i]) < 0) hasOutput = true;
|
|
}
|
|
// If the random element can be combined with another element to produce new
|
|
// results, select it and return
|
|
if(outputs != null && hasOutput) {
|
|
curIndex = found.indexOf(e1);
|
|
return true;
|
|
}
|
|
}
|
|
e1 = random(found);
|
|
}
|
|
}
|
|
|
|
function realMillis() {
|
|
return millis() + savedTime;
|
|
}
|
|
|
|
// When adding, removing, or changing found elements always call this immediately after
|
|
function foundUpdated() {
|
|
sortedFound = aSort(found);
|
|
saveCookie();
|
|
}
|