let background = ["8c4cdf25382cdf2c9ef9dead4b258e89c3f409f985de2bec55fdf667b5e75295i0", "4ea5259ce1d205a21a2559807b4a6353d0e9672d68a1035e684c78c6970b1169i0", "bcedbf29e49eb0ef744fc9f88060f6702f2a7eeeb60312077c7b1f523e9d21a5i0", "c3c7b22c73101d9fb368fc4f7291297a4b54fb13261070640e34f5c7755e2943i0", "debcb63129f61ab9975cdcd8f226f9cff55f7013e56396a3d489754a7f1e846bi0", "b3ec0f2aed9d00788bd2af0e1e5484f1ebd4bd4fca20ff33d1118f373869d778i0", "0f6e181abdc1262e5e2675d3df4a5e3f20e566de2f1635658df48ec1893596b9i0"]; let symbol = ["609fa90d03d5c67dcddeb2bd3688fcee1d119f91c3173d4e23a8a8bb879fbfbdi0", "afb7c0171979983084fe6141c1fb00c18bba9f489073ee20f4d32b86a9a6e2f1i0", "c0369db3d744b79d921d1c552cf2416c945d01548b87e920ffa46959f88d5783i0", "b52a80a3a5c261fe8bb2002b5ef87b4b6f1b0d61570e3b66ad54fb4ee25395ebi0", "47bc09d9c9104eddba855f9d633f86d26c41615f4ad86b457c8ffe09ae71b8b8i0", "e70aa67c0923da7abfc5977f77af83405394746efd9bc483231de423a1bc3429i0", "a6a4eaba1b795eb73e0f29c0e257bccbad8705bcfca91de0f73f6fed7ae23b7bi0"]; let topleftnumber = ["804dd3f7f2bd4cff7507603bb40629d8f8c5cffec59dae8313e3fa36b1fa2620i0", "a5302204ee71f05d5d3abca9d25d2b0d0df87ad8206e3e790410d51f8e1e3729i0", "21a0ff5f2e4cfd73822d3911dcd9342831c43b8b4b6104f313432ff01d8a9e93i0","91458abff3f9546f59e3c88b5d4fc6d76589401c017f48db892295f03b3f6a85i0","03030a7446fccbb4a8915654070f5cf689e4c9f96b9cef0b4d539b5038c1ffd3i0", "3f6da130cb36cc4ef136cec06703b974d3cee528fb7d76a17a1a43093ce2c1f6i0"]; let toprightnumber = ["6c85645018477643c51f60cb2d12f42bd3f332f1826b4f52d2b7d87950116e7ai0", "af405659c399452dc4851772a48bea48c78f20f2cf44e98f01ec87c6b427905bi0", "026e4cc93fb74a1773ef6f82af762b767b4c8b3c8217725e6c4c695695495917i0","2370102b2d7f8e0ef6576c005f7e227936a791b4ea7642324690dedd4c2ceea5i0","b752cb6e8d4de04f620fef8651280959873dcd533c3e13d350ff74b89363c3d7i0", "a5d47aacbb0b4be56a9cfa6ca4747758cb8362cb4e50c3f1c6b9de54526cb08bi0"]; let middleleftnumber = ["d7fdbb8dc6c19329d45b6bdc821ecc669985639783e221942a6d4a0e39ad62e4i0", "3085c4e050609ae60b13213084ce028ab4ac80c24b8edd9696c304fd5ea5f285i0", "22b1cd743a941f90dcc2b344d38a4a0d31e6e3b253910e61b7a5454cb751b8d2i0","30f09b3b6db735206df9d29fd41b31f663a92229253bac4a70d9e519b9faba28i0","f6c20127059637fa9d4ffa00e075dbd2af8d854ad3cc68a06fe0e449ef6ae579i0", "5d053b9223032203733e1a9d46c9602c087ad21e2f6747a7cab36a39e0dffd2bi0"]; let middlerightnumber = ["179e80504d9d9d17625eaa15aa884e849b4187ba5813efddf0f0e8e0212f2e76i0", "8b6699ec4a01f73ed21f10d8c24e8dceab61c6b43689a7e4b256007c2f73a884i0", "1c42a28f0923b59b7bce253a58696b07bc6a4d7d75c5496c4e762c289cd9f767i0","d95b01eda8688bbf23bb45226b7ad4a8f95330a5450de820570e9c038b20faa1i0","86a3d3ae6061533a2ccfe5e503a56ac83b61991112c89eaaf5346926a5302b48i0", "aabd715d6ea5d949b67aa5d9742d5fc0969cfd1c21f1aedce1bc71649bb6be7ci0"]; let bottomleftnumber = ["0a12a0a3c3d2d45210b4178eb7a8bf11f70d28be9ed378cf174a0a8f53a95f59i0", "608dbc5f86e1b76ae74a01bd1fb9afb1271ba7e45fb4cd6fd70467c87df54596i0", "52b484196009effcc346f935f573cdc06e146b3d638621ccc59ad5237f175e7fi0","198a0bccf4ae22b8506ca3e305e1776a44e4188346bcf49f95221e791973a702i0","b8cb9629817f2160bf64f12e03302f7f66132af8eec8728c84b3647741443175i0", "e34fa7f5f5f946e36034cd52f659b5d53c7fca9e0852342face8ef01082eeb7di0"]; let bottomrightnumber = ["e8cab4f7b2e23c01b9672d1a2a28091b234b6c9dff347cb1db82ded0e306c5c7i0", "8c8e4a74d4667223f73360c6af2d78bdc60e62b29fdb268e6ba70240e9bfb864i0", "d395ad21444006521ed3256b6e4ddabbe0d4d8b15395e8d27f8126dc91e164fei0","50e13d6fdded7aa60b08429b7fb9966db2f2b164f087f6217a8073ed0cec3de9i0","80cd95096820a1f5a4b486b697211cd23bbf269a571c7512893bdddee65de153i0", "d17be4b2bceeed905dfe51080df89af6f982404ccc0747dd6b01c49b3985fb5ai0"]; let audioFiles = ["3f9f6081e9cb199a52720d56301eefd3fc11488d299f04da9d3b3a8be982394ai0", "1c11d8f3aff52c5d83c0798d5cd5c0f6b9c1cb82af0b9edfa6b1488f826642b6i0", "96212f592c82e7a1199711dd7601ce9e3f14ad9680fe93a9a8fe80c54a73a2d8i0", "cea3b791ef5a9f5e785d6fa560a5dfefa4e5aa227326f435d4056e001c6784edi0", "90a15d6d1997c65a687a397316df26b23d34ecb5a9fbdbdc0368c00d6b8d50c4i0", "308b1cdf45033aa4eafd2452f824edd95d8496b67f4359dcc5ec45ad69b0bea0i0", "7c8b6fe672385addfb910083d64f6f9e793705d8985603a23b14c9849189e6c4i0"]; let blockHeight; const mod = 2 ** 31 - 1; const a = 1103515245; const c = 12345; let seed; let audioElement; let currentAudioFile; let currentTraits; let wasAudioPlaying = false; let canvasClickHandler; let nftIdElement = document.querySelector('[data-id]'); let nftId = nftIdElement ? nftIdElement.getAttribute('data-id') : ''; async function getBlockHeight() { const response = await fetch('/blockheight'); const newBlockHeight = await response.text() || 0; if (newBlockHeight !== blockHeight) { blockHeight = newBlockHeight; seed = hashCode(blockHeight + nftId); currentAudioFile = null; currentTraits = null; init(); } } const groups = ['ABCD', 'EFGH', 'IJKL', 'MNOP', 'QRST', 'UVWX', 'YZ']; function getEckzahlenSumme() { const numValues = { "804dd3f7f2bd4cff7507603bb40629d8f8c5cffec59dae8313e3fa36b1fa2620i0": 100, "a5302204ee71f05d5d3abca9d25d2b0d0df87ad8206e3e790410d51f8e1e3729i0": 200, "21a0ff5f2e4cfd73822d3911dcd9342831c43b8b4b6104f313432ff01d8a9e93i0": 300 "91458abff3f9546f59e3c88b5d4fc6d76589401c017f48db892295f03b3f6a85i0": 400 "03030a7446fccbb4a8915654070f5cf689e4c9f96b9cef0b4d539b5038c1ffd3i0": 500 "3f6da130cb36cc4ef136cec06703b974d3cee528fb7d76a17a1a43093ce2c1f6i0": 600 "6c85645018477643c51f60cb2d12f42bd3f332f1826b4f52d2b7d87950116e7ai0": 100, "af405659c399452dc4851772a48bea48c78f20f2cf44e98f01ec87c6b427905bi0": 200, "026e4cc93fb74a1773ef6f82af762b767b4c8b3c8217725e6c4c695695495917i0": 300 "2370102b2d7f8e0ef6576c005f7e227936a791b4ea7642324690dedd4c2ceea5i0": 400 "b752cb6e8d4de04f620fef8651280959873dcd533c3e13d350ff74b89363c3d7i0": 500 "a5d47aacbb0b4be56a9cfa6ca4747758cb8362cb4e50c3f1c6b9de54526cb08bi0": 600 "d7fdbb8dc6c19329d45b6bdc821ecc669985639783e221942a6d4a0e39ad62e4i0": 100, "3085c4e050609ae60b13213084ce028ab4ac80c24b8edd9696c304fd5ea5f285i0": 200, "22b1cd743a941f90dcc2b344d38a4a0d31e6e3b253910e61b7a5454cb751b8d2i0": 300 "30f09b3b6db735206df9d29fd41b31f663a92229253bac4a70d9e519b9faba28i0": 400 "f6c20127059637fa9d4ffa00e075dbd2af8d854ad3cc68a06fe0e449ef6ae579i0": 500 "5d053b9223032203733e1a9d46c9602c087ad21e2f6747a7cab36a39e0dffd2bi0": 600 "179e80504d9d9d17625eaa15aa884e849b4187ba5813efddf0f0e8e0212f2e76i0": 100, "8b6699ec4a01f73ed21f10d8c24e8dceab61c6b43689a7e4b256007c2f73a884i0": 200, "1c42a28f0923b59b7bce253a58696b07bc6a4d7d75c5496c4e762c289cd9f767i0": 300 "d95b01eda8688bbf23bb45226b7ad4a8f95330a5450de820570e9c038b20faa1i0": 400 "86a3d3ae6061533a2ccfe5e503a56ac83b61991112c89eaaf5346926a5302b48i0": 500 "aabd715d6ea5d949b67aa5d9742d5fc0969cfd1c21f1aedce1bc71649bb6be7ci0": 600 "0a12a0a3c3d2d45210b4178eb7a8bf11f70d28be9ed378cf174a0a8f53a95f59i0": 100, "608dbc5f86e1b76ae74a01bd1fb9afb1271ba7e45fb4cd6fd70467c87df54596i0": 200, "52b484196009effcc346f935f573cdc06e146b3d638621ccc59ad5237f175e7fi0": 300 "198a0bccf4ae22b8506ca3e305e1776a44e4188346bcf49f95221e791973a702i0": 400 "b8cb9629817f2160bf64f12e03302f7f66132af8eec8728c84b3647741443175i0": 500 "e34fa7f5f5f946e36034cd52f659b5d53c7fca9e0852342face8ef01082eeb7di0": 600 "e8cab4f7b2e23c01b9672d1a2a28091b234b6c9dff347cb1db82ded0e306c5c7i0": 100, "8c8e4a74d4667223f73360c6af2d78bdc60e62b29fdb268e6ba70240e9bfb864i0": 200, "d395ad21444006521ed3256b6e4ddabbe0d4d8b15395e8d27f8126dc91e164fei0": 300 "50e13d6fdded7aa60b08429b7fb9966db2f2b164f087f6217a8073ed0cec3de9i0": 400 "80cd95096820a1f5a4b486b697211cd23bbf269a571c7512893bdddee65de153i0": 500 "d17be4b2bceeed905dfe51080df89af6f982404ccc0747dd6b01c49b3985fb5ai0": 600 }; let sum = 0; sum += numValues[topleftnumber[currentIndex % topleftnumber.length]]; sum += numValues[toprightnumber[currentIndex % toprightnumber.length]]; sum += numValues[middlerightnumber[currentIndex % toprightnumber.length]]; sum += numValues[middleleftnumber[currentIndex % toprightnumber.length]]; sum += numValues[bottomrightnumber[currentIndex % toprightnumber.length]]; sum += numValues[bottomleftnumber[currentIndex % toprightnumber.length]]; return sum; } function getLetterFromUserInput(cornernumber, symbol) { const groupIndex = groups.findIndex(group => group === symbol); const indexInGroup = Math.floor(cornernumber / 600) % groups[groupIndex].length; return groups[groupIndex][indexInGroup]; } function random() { seed = (a * seed + c) % mod; return seed / mod; } function getRandomTrait(array) { return array[Math.floor(random() * array.length)]; } function hashCode(str) { let hash = 0; if (str.length === 0) { return hash; } for (let i = 0; i < str.length; i++) { const char = str.charCodeAt(i); hash = (hash << 5) - hash + char; hash = hash & hash; } return Math.abs(hash); } async function loadImages(images) { let loadedImages = []; for (let imgSrc of images) { const img = new Image(); img.src = await fetch('/content/' + imgSrc) .then(response => response.blob()) .then(URL.createObjectURL); await new Promise(resolve => { img.onload = () => { resolve(); }; }); loadedImages.push(img); } return loadedImages; } async function draw(canvas, images) { const ctx = canvas.getContext('2d'); for (let img of images) { ctx.drawImage(img, 0, 0, canvas.width, canvas.height); } } let currentIndex = 0; const sentence = "WEALLLOVEYOUCASEYRODARMORTHANKYOUFOREVERYTHING"; async function init() { if (!currentTraits) { const cornernumber = getcornernumber(); const currentLetter = sentence[currentIndex]; const groupIndex = groups.findIndex(gruppe => gruppe.includes(currentLetter)); if (groupIndex !== -1) { const symbolIndex = groupIndex; currentTraits = [ getRandomTrait(background), symbolIDs[symbolIndex], topleftnumber[cornernumber % topleftnumber.length], toprightnumber[cornernumber % toprightnumber.length], middleleftnumber[cornernumber % middleleftnumber.length], middlerightnumber[cornernumber % middlerightnumber.length], bottomleftnumber[cornernumber % bottomleftnumber.length], bottomrightnumber[cornernumber % bottomrightnumber.length] ]; } currentIndex = (currentIndex + 1) % sentence.length; } const imagesToDraw = await loadImages(currentTraits); draw(document.getElementById('c'), imagesToDraw); if (audioElement) { audioElement.pause(); audioElement.currentTime = 0; } if (!currentAudioFile) { currentAudioFile = getRandomTrait(audioFiles); } let audioBlobUrl = await fetch('/content/' + currentAudioFile) .then(response => response.blob()) .then(URL.createObjectURL); audioElement = new Audio(audioBlobUrl); audioElement.volume = 0.9; audioElement.autoplay = false; audioElement.loop = false; audioElement.addEventListener('canplaythrough', function() { const canvasElement = document.getElementById('c'); if (canvasClickHandler) { canvasElement.removeEventListener('click', canvasClickHandler); } canvasClickHandler = function() { if (!audioElement.paused) { audioElement.currentTime = 0; } audioElement.play(); wasAudioPlaying = true; }; canvasElement.addEventListener('click', canvasClickHandler); }); } } getBlockHeight(); setInterval(getBlockHeight, 30000); document.addEventListener('visibilitychange', function() { if (document.hidden) { if (audioElement && !audioElement.paused) { wasAudioPlaying = true; audioElement.pause(); } else { wasAudioPlaying = false; } } else { if (audioElement && wasAudioPlaying && audioElement.paused) { wasAudioPlaying = false; audioElement.play(); } } });