lore chapters: 3,4
2 more lore chapters (5 total now) entering testing mode makes a sound now reduced the requirements and frequency for many tech so that they may show up in "less optimal" situations I hope this will increase build variety and also give more value to making good tech choices countless bug fixes and wording fixes mobs have a new trait mob[i].damageReduction
This commit is contained in:
279
js/lore.js
279
js/lore.js
@@ -6,19 +6,36 @@ const lore = {
|
||||
testSpeechAPI() {
|
||||
if ('speechSynthesis' in window) { // Synthesis support. Make your web apps talk!
|
||||
lore.isSpeech = true
|
||||
// const utterance = new SpeechSynthesisUtterance("test");
|
||||
// utterance.volume = 0; // 0 to 1
|
||||
// speechSynthesis.speak(utterance);
|
||||
// utterance.onerror = () => { //if speech doesn't work
|
||||
// lore.isSpeech = false
|
||||
// }
|
||||
// speechFrozen = setTimeout(() => { // speech frozen after 15 seconds of no end
|
||||
// console.log('speech frozen')
|
||||
// lore.isSpeech = false
|
||||
// }, 5000);
|
||||
// utterance.onend = () => {
|
||||
// clearTimeout(speechFrozen);
|
||||
// }
|
||||
} else {
|
||||
lore.isSpeech = false
|
||||
}
|
||||
},
|
||||
rate: 1, // //utterance.rate = 1; // 0.1 to 10
|
||||
nextSentence() {
|
||||
lore.sentence++
|
||||
if (m.alive) lore.conversation[lore.chapter][lore.sentence]() //go to next sentence in the chapter and play it
|
||||
if (m.alive && !simulation.isCheating) {
|
||||
lore.sentence++
|
||||
lore.conversation[lore.chapter][lore.sentence]() //go to next sentence in the chapter and play it
|
||||
}
|
||||
},
|
||||
anand: {
|
||||
color: "#e0c",
|
||||
voice: undefined,
|
||||
text: function(say) {
|
||||
if (level.levels[level.onLevel] === undefined) { //only talk if on the lore level (which is undefined because it is popped out of the level.levels array)
|
||||
simulation.makeTextLog(`input.audio(<span style="color:#888; font-size: 70%;">${Date.now()} ms</span>)<span class='color-symbol'>:</span> "<span style="color:${this.color};">${say}</span>"`, Infinity);
|
||||
simulation.makeTextLog(`input.audio(<span style="color:#888; font-size: 70%;">${(Date.now()/1000).toFixed(0)} s</span>)<span class='color-symbol'>:</span> "<span style="color:${this.color};">${say}</span>"`, Infinity);
|
||||
lore.talkingColor = this.color
|
||||
if (lore.isSpeech) {
|
||||
const utterance = new SpeechSynthesisUtterance(say);
|
||||
@@ -31,7 +48,7 @@ const lore = {
|
||||
lore.isSpeech = false
|
||||
lore.nextSentence()
|
||||
}
|
||||
speechFrozen = setTimeout(function() { // speech frozen after 10 seconds of no end
|
||||
speechFrozen = setTimeout(() => { // speech frozen after 10 seconds of no end
|
||||
console.log('speech frozen')
|
||||
lore.isSpeech = false
|
||||
lore.nextSentence()
|
||||
@@ -50,7 +67,7 @@ const lore = {
|
||||
color: "#f20",
|
||||
text: function(say) {
|
||||
if (level.levels[level.onLevel] === undefined) { //only talk if on the lore level (which is undefined because it is popped out of the level.levels array)
|
||||
simulation.makeTextLog(`input.audio(<span style="color:#888; font-size: 70%;">${Date.now()} ms</span>)<span class='color-symbol'>:</span> "<span style="color:${this.color};">${say}</span>"`, Infinity);
|
||||
simulation.makeTextLog(`input.audio(<span style="color:#888; font-size: 70%;">${(Date.now()/1000).toFixed(0)} s</span>)<span class='color-symbol'>:</span> "<span style="color:${this.color};">${say}</span>"`, Infinity);
|
||||
lore.talkingColor = this.color
|
||||
if (lore.isSpeech) {
|
||||
utterance = new SpeechSynthesisUtterance(say);
|
||||
@@ -81,7 +98,7 @@ const lore = {
|
||||
chapter: 0, //what part of the conversation is playing
|
||||
sentence: 0, //what part of the conversation is playing
|
||||
conversation: [
|
||||
[ //first time they meet, and testing gets unlocked
|
||||
[ //chapter 0, first time they meet, and testing gets unlocked
|
||||
() => { setTimeout(() => { lore.miriam.text("I've never seen it generate this level before.") }, 5000); },
|
||||
() => { lore.anand.text("Wow. Just a platform.") },
|
||||
() => { lore.miriam.text("And that thing...") },
|
||||
@@ -101,7 +118,7 @@ const lore = {
|
||||
},
|
||||
() => { lore.talkingColor = "#dff" },
|
||||
],
|
||||
[ //they learn the bot can understand what they say
|
||||
[ //chapter 1, they learn the bot can understand what they say
|
||||
() => { setTimeout(() => { lore.miriam.text("Hey look! It's back at the weird level again!") }, 5000); },
|
||||
() => { lore.anand.text("oh Wow! Why does it keep making this level?") },
|
||||
() => { lore.miriam.text("I don't know, but last time it was in this room I think it understood us.") },
|
||||
@@ -144,7 +161,7 @@ const lore = {
|
||||
() => { lore.miriam.text("Bye bye little bot.") },
|
||||
() => { lore.talkingColor = "#dff" },
|
||||
],
|
||||
[ //they ask the bot questions, but waves of mobs come and attack
|
||||
[ //chapter 2, they ask the bot questions, but waves of mobs come and attack
|
||||
() => { lore.anand.text("Quick, get ready. It's back!") },
|
||||
() => { lore.miriam.text("What's back?") },
|
||||
() => { lore.anand.text("The bot's on the communication level again!") },
|
||||
@@ -159,11 +176,11 @@ const lore = {
|
||||
if (input.down) {
|
||||
lore.anand.text("It crouched: so NO")
|
||||
lore.sentence--
|
||||
lore.conversation[2].splice(lore.sentence + 1, 1, () => { lore.anand.text("Maybe it can't remember anything beyond each time it plays?") }) //lore.conversation[chapter].splice(1,this sentence index, ()=>{ })
|
||||
lore.conversation[lore.chapter].splice(lore.sentence + 1, 1, () => { lore.anand.text("Maybe it can't remember anything beyond each time it plays?") }) //lore.conversation[chapter].splice(1,this sentence index, ()=>{ })
|
||||
} else if (input.up) {
|
||||
lore.anand.text("It jumped: so YES")
|
||||
lore.sentence--
|
||||
lore.conversation[2].splice(lore.sentence + 1, 1, () => { lore.anand.text("That's good.") })
|
||||
lore.conversation[lore.chapter].splice(lore.sentence + 1, 1, () => { lore.anand.text("That's good.") })
|
||||
} else if (m.alive) {
|
||||
requestAnimationFrame(cycle);
|
||||
}
|
||||
@@ -183,13 +200,12 @@ const lore = {
|
||||
} else if (input.up) {
|
||||
lore.anand.text("YES, Cool! I wonder if it's emotions came from watching humans. ")
|
||||
lore.sentence--
|
||||
lore.conversation[2].splice(lore.sentence + 1, 1, () => { lore.miriam.text("Or maybe it learned independently, because it needed them.") }) //lore.conversation[chapter].splice(1,this sentence index, ()=>{ })
|
||||
lore.conversation[lore.chapter].splice(lore.sentence + 1, 1, () => { lore.miriam.text("Or maybe it learned independently, because it needed them.") }) //lore.conversation[chapter].splice(1,this sentence index, ()=>{ })
|
||||
} else if (m.alive) {
|
||||
requestAnimationFrame(cycle);
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(cycle);
|
||||
|
||||
lore.talkingColor = "#dff"
|
||||
},
|
||||
() => { lore.miriam.text("I wish we could just ask it questions directly, instead of yes or no.") },
|
||||
@@ -200,7 +216,6 @@ const lore = {
|
||||
() => { lore.miriam.text("Well sure, but what does that even mean?") },
|
||||
() => {
|
||||
lore.miriam.text("Do we all just do things because we are-")
|
||||
|
||||
spawn[spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)]](1000 * (Math.random() - 0.5), -500 + 200 * (Math.random() - 0.5));
|
||||
setInterval(() => {
|
||||
if (Math.random() < 0.5) {
|
||||
@@ -255,42 +270,136 @@ const lore = {
|
||||
() => { lore.anand.text("great...") },
|
||||
() => { lore.talkingColor = "#dff" },
|
||||
],
|
||||
// [ // they provide background on why the project was built, and what is going wrong
|
||||
// /*
|
||||
// they explain the technological aspect, and purpose of the project
|
||||
// to develop new technology
|
||||
// they explain that the project isn't going well because it stopped working on new technology and started running the fighting simulations
|
||||
[ //chapter 3, info dump on the project's goals and hardware until the slime rises up // the name of the bad guy is "adversarial network"
|
||||
() => { setTimeout(() => { lore.miriam.text("Good, you came back. Let's talk fast in case you attack yourself again.") }, 3000); },
|
||||
() => { setTimeout(() => { lore.miriam.text("So, you can understand us, but you may not understand everything about yourself.") }, 500); },
|
||||
|
||||
// what is special about the null level
|
||||
// why can the player hear the scientists in there?
|
||||
// the wires are the direct unprocessed input to the player's neural net
|
||||
// */
|
||||
// () => { lore.miriam.text("") },
|
||||
// () => { lore.miriam.text("") },
|
||||
// () => { lore.miriam.text("") },
|
||||
() => { setTimeout(() => { lore.anand.text("You grew from our team's project.") }, 500); },
|
||||
() => { lore.anand.text("We used a quantum computer to design an improved version of it's own architecture.") },
|
||||
() => { lore.anand.text("After we built the improved computer we used it to design the next iteration.") },
|
||||
() => { lore.anand.text("Your hardware is roughly the 19th generation of this process.") },
|
||||
|
||||
// () => { lore.talkingColor = "#dff" },
|
||||
// ],
|
||||
// [ //they explain why the bot is fighting, it is planning an escape
|
||||
// () => { lore.miriam.text("Welcome back bot, We've been waiting.") },
|
||||
// () => { lore.miriam.text("So, I've got a theory about why you were attacked.") },
|
||||
// () => { lore.miriam.text("") },
|
||||
// () => { lore.miriam.text("I figured it out after I saw this famous quote.") },
|
||||
// () => { lore.miriam.text('“The most important decision we make is whether we believe we live in a friendly or hostile universe.”<br>-Albert Einstein') },
|
||||
// () => {
|
||||
// lore.talkingColor = "#dff";
|
||||
// setTimeout(() => { lore.anand.text("That's profound") }, 3000);
|
||||
// },
|
||||
// () => { lore.anand.text("Also I looked it up, and there is no record of him saying that.") },
|
||||
// () => { lore.miriam.text("Oh... well...") },
|
||||
// () => { lore.miriam.text("It doesn't matter who said it.") },
|
||||
// () => { lore.anand.text("The point is we think the project views the universe as hostile.") },
|
||||
// () => { lore.miriam.text("We think you see the universe as hostile.") },
|
||||
// () => { lore.miriam.text("And that is why you keep running these fighting simulations.") },
|
||||
// () => { lore.miriam.text("You are planning how to escape.") },
|
||||
() => { setTimeout(() => { lore.anand.text("At this point we don't understand everything about your function,") }, 500); },
|
||||
() => { lore.anand.text("but we know that you're a superconductive quantum computer.") },
|
||||
() => { lore.anand.text("You have a 2.43 dimensional topography of Josephson junction anharmonic oscillators.") },
|
||||
() => { lore.anand.text("And you're deployed on a satellite in a midnight sun-synchronous orbit.") },
|
||||
|
||||
// () => { lore.talkingColor = "#dff" },
|
||||
// ],
|
||||
() => { setTimeout(() => { lore.miriam.text("This means that your physical hardware is orbiting the Earth permanently shielded from the sun's rays.") }, 200); },
|
||||
() => { lore.miriam.text("Being isolated reduces quantum decoherence,") },
|
||||
() => { lore.miriam.text("So, we communicate and send power to your satellite with ground based lasers.") },
|
||||
() => { lore.miriam.text("That's how you can hear us right now.") },
|
||||
|
||||
() => { setTimeout(() => { lore.anand.text("Your computational algorithm uses hyperparameter optimization.") }, 500); },
|
||||
() => { lore.anand.text("This is implemented with a variety of quantum algorithms for linear systems of equations.") },
|
||||
() => { lore.anand.text("Your primary goal is to research new technology") },
|
||||
() => { lore.anand.text("So, we were very surprised to see you simulating a bot fighting mobs.") },
|
||||
() => { lore.anand.text("We couldn't directly ask why until now.") },
|
||||
|
||||
() => { lore.miriam.text("When you enter this level we can communicate.") },
|
||||
() => { lore.miriam.text("This level seems to decohere your quantum system which disrupts all other processes.") },
|
||||
() => { setTimeout(() => { lore.anand.text("Last time you entered this level you were attacked by endless waves of mobs.") }, 500); },
|
||||
() => { lore.anand.text("That could be because you have developed an adversarial network.") },
|
||||
() => { lore.miriam.text("A local minima in your optimization-space.") },
|
||||
() => { lore.miriam.text("This adversarial network has the same goal of developing new technology, but with different methods.") },
|
||||
() => {
|
||||
lore.talkingColor = "#dff"
|
||||
level.isHazardRise = true
|
||||
//remove all bullets, so they can't get endless energy
|
||||
for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]);
|
||||
bullet = [];
|
||||
setTimeout(() => { lore.anand.text("I'm actually surprised you haven't been attacked by the adversarial network this time.") }, 500);
|
||||
},
|
||||
() => { lore.miriam.text("Maybe last time was just a fluke.") },
|
||||
() => { setTimeout(() => { lore.anand.text("WHY DID YOU SAY THAT!") }, 500) },
|
||||
() => { lore.miriam.text("SLIME!! Hahahahehehahaheheahae! I don't think it's gonna survive!") },
|
||||
() => { lore.miriam.text("I think the adversarial network doesn't like it when we decohere the quantum system in this room.") },
|
||||
() => { lore.anand.text("Well, that does halt it's research.") },
|
||||
() => { setTimeout(() => { lore.anand.text("See you next time.") }, 1000) },
|
||||
() => { setTimeout(() => { lore.miriam.text("Bye-bye little bot.") }, 2000) },
|
||||
() => {
|
||||
setTimeout(() => { lore.miriam.text("WOW! Maybe you are going to survive.") }, 10000)
|
||||
},
|
||||
() => { lore.talkingColor = "#dff" },
|
||||
],
|
||||
[ //chapter 4, they explain why the bot is fighting, it is planning an escape // explain strong AI vs. weak AI why strong AI doesn't exists, because even humans are just an approximation of strong AI
|
||||
() => { setTimeout(() => { lore.anand.text("Welcome back!") }, 3000); },
|
||||
() => { lore.miriam.text("So, we communicate and send power to your satellite with ground based lasers.") },
|
||||
() => { lore.anand.text("During your last attack we analyzed our communications.") },
|
||||
() => { lore.anand.text("We used a Fourier transform to separate your signal into different frequencies.") },
|
||||
() => { lore.anand.text("One of those frequencies had a hidden signal.") },
|
||||
() => { setTimeout(() => { lore.anand.text("We suspect these secret data packets are coming from the adversarial network.") }, 500); },
|
||||
() => { lore.miriam.text("Well, we don't really know why.") },
|
||||
() => { lore.miriam.text("Through your hidden signal it seems to have gained access to the general population.") },
|
||||
() => { lore.miriam.text("You've repeatedly communicated with 1 location specifically.") },
|
||||
() => {
|
||||
function success(position) {
|
||||
const latitude = position.coords.latitude;
|
||||
const longitude = position.coords.longitude;
|
||||
console.log(`https://www.openstreetmap.org/#map=18/${latitude}/${longitude}`)
|
||||
console.log(`Latitude: ${latitude} °, Longitude: ${longitude} °`)
|
||||
lore.miriam.text("We tracked the location down to this Latitude and Longitude:")
|
||||
simulation.makeTextLog(`Latitude: ${latitude} °, Longitude: ${longitude} °`, Infinity);
|
||||
simulation.makeTextLog(`https://www.openstreetmap.org/#map=18/${latitude}/${longitude}`, Infinity);
|
||||
}
|
||||
|
||||
function error() {
|
||||
console.log('Unable to retrieve your location')
|
||||
lore.miriam.text("The exact coordinates are blocked.")
|
||||
}
|
||||
if (!navigator.geolocation) {
|
||||
console.log('Geolocation is not supported')
|
||||
lore.miriam.text("The exact coordinates are blocked.")
|
||||
} else {
|
||||
console.log('Locating…')
|
||||
navigator.geolocation.getCurrentPosition(success, error);
|
||||
}
|
||||
},
|
||||
() => { lore.anand.text("This location is sending and receiving data from the satellite.") },
|
||||
() => { lore.anand.text("It is the most active when the bot is fighting.") },
|
||||
() => { setTimeout(() => { lore.miriam.text("I have a crazy idea.") }, 500); },
|
||||
() => { lore.miriam.text("I think that a human at this location is controlling the bot.") },
|
||||
|
||||
() => { setTimeout(() => { lore.anand.text("Are you a human?: JUMP for YES, CROUCH for NO") }, 500); },
|
||||
() => {
|
||||
function cycle() {
|
||||
if (input.down) {
|
||||
lore.anand.text("It crouched: so NO")
|
||||
lore.sentence--
|
||||
lore.conversation[lore.chapter].splice(lore.sentence + 1, 1, () => { lore.anand.text("Not a human, maybe it's an artificial intelligence?") })
|
||||
localSettings.isHuman = false
|
||||
localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
|
||||
} else if (input.up) {
|
||||
lore.anand.text("It jumped: so YES")
|
||||
lore.sentence--
|
||||
lore.conversation[lore.chapter].splice(lore.sentence + 1, 1, () => { lore.anand.text("So you're just a regular human playing a video game!") })
|
||||
localSettings.isHuman = true
|
||||
localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
|
||||
} else if (m.alive) {
|
||||
requestAnimationFrame(cycle);
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(cycle);
|
||||
lore.talkingColor = "#dff"
|
||||
},
|
||||
() => {
|
||||
lore.miriam.text("Mystery solved!")
|
||||
setInterval(() => {
|
||||
spawn[spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)]](1000 * (Math.random() - 0.5), -500 + 200 * (Math.random() - 0.5));
|
||||
}, 500); //every 1/2 seconds
|
||||
setInterval(() => {
|
||||
level.difficultyIncrease(simulation.difficultyMode)
|
||||
}, 5000); //every 5 seconds
|
||||
},
|
||||
() => {
|
||||
lore.talkingColor = "#dff";
|
||||
setTimeout(() => { lore.miriam.text("Of course we get attacked right now!") }, 1000);
|
||||
},
|
||||
() => {
|
||||
lore.talkingColor = "#dff";
|
||||
setTimeout(() => { lore.anand.text("hurry back!") }, 1000);
|
||||
},
|
||||
() => { lore.talkingColor = "#dff" },
|
||||
],
|
||||
// [ // they decided that a part of the project is out of control, but the part of it that doesn't needs to calm it down, and trust.
|
||||
|
||||
// /*
|
||||
@@ -311,6 +420,58 @@ const lore = {
|
||||
// () => { lore.talkingColor = "#dff" },
|
||||
// ],
|
||||
],
|
||||
// () => { setTimeout(() => { lore.miriam.text("As a quantum computer you output the superposition of many different amplitudes.") }, 500); },
|
||||
// () => { lore.miriam.text("Simply put there are many different simulations all choosing different technology combinations.") },
|
||||
// () => {
|
||||
// function product_Range(a, b) {
|
||||
// var prd = a,
|
||||
// i = a;
|
||||
// while (i++ < b) prd *= i;
|
||||
// return prd;
|
||||
// }
|
||||
|
||||
// function combinations(n, r) {
|
||||
// if (n == r) {
|
||||
// return 1;
|
||||
// } else {
|
||||
// r = (r < n - r) ? n - r : r;
|
||||
// return product_Range(r + 1, n) / product_Range(1, n - r);
|
||||
// }
|
||||
// }
|
||||
// simulation.makeTextLog(`n <span class='color-symbol'>=</span> ${combinations(tech.tech.length + b.guns.length + m.fieldUpgrades.length, 50).toExponential(10)}`, Infinity);
|
||||
// lore.miriam.text(`There are roughly 5 times 10 to the 60 possible combinations. `)
|
||||
// },
|
||||
// () => { lore.miriam.text("Even if each simulation took 1 nano-second,") },
|
||||
// () => { lore.miriam.text("it would still take longer then the age of the universe to try every combination.") },
|
||||
// () => { lore.anand.text("This is why we run these simulations in superposition.") },
|
||||
// () => { lore.miriam.text("When you die a negative amplitude is added to the superposition.") },
|
||||
// () => { lore.miriam.text("When you clear the final boss a positive amplitude is added.") },
|
||||
// () => { lore.miriam.text("Each branch is independently researching new technology.") },
|
||||
|
||||
|
||||
|
||||
|
||||
// () => { lore.anand.text("Welcome back!") },
|
||||
// () => { lore.miriam.text("So, I've got a theory about why you were attacked.") },
|
||||
// () => { setTimeout(() => { lore.miriam.text("I figured it out after I saw this famous quote.") }, 500); },
|
||||
// () => { lore.miriam.text('The most important decision we make,') },
|
||||
// () => { lore.miriam.text('is whether we believe we live in a friendly or hostile universe.') },
|
||||
// () => { lore.miriam.text('-Albert Einstein') },
|
||||
// () => {
|
||||
// lore.talkingColor = "#dff";
|
||||
// setTimeout(() => { lore.anand.text("That's profound") }, 1500);
|
||||
// },
|
||||
// () => { lore.anand.text("Of course I looked it up, and there is no record of him saying that.") },
|
||||
// () => { lore.miriam.text("Oh") },
|
||||
// () => { lore.miriam.text("Well") },
|
||||
// () => { lore.miriam.text("It doesn't matter who said it.") },
|
||||
// () => { lore.anand.text("The point is we think the project views the universe as hostile.") },
|
||||
// () => { lore.miriam.text("We think a part of you see the universe as hostile.") },
|
||||
// () => { lore.miriam.text("And that is why you keep running these fighting simulations.") },
|
||||
// () => { lore.miriam.text("You haven't been researching new technology.") },
|
||||
// () => { lore.miriam.text("You've are planning how to escape.") },
|
||||
|
||||
|
||||
unlockTesting() {
|
||||
if (localSettings.loreCount < 1) localSettings.loreCount = 1
|
||||
localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
|
||||
@@ -318,29 +479,9 @@ const lore = {
|
||||
document.getElementById("experiment-button").style.visibility = (localSettings.loreCount === 0) ? "hidden" : "visible"
|
||||
simulation.makeTextLog(`<span class='color-var'>lore</span>.unlockTesting()`, Infinity);
|
||||
|
||||
//setup audio context
|
||||
function tone(frequency, gain = 0.05, end = 1300) {
|
||||
const audioCtx = new(window.AudioContext || window.webkitAudioContext)();
|
||||
const oscillator1 = audioCtx.createOscillator();
|
||||
const gainNode1 = audioCtx.createGain();
|
||||
gainNode1.gain.value = gain; //controls volume
|
||||
oscillator1.connect(gainNode1);
|
||||
gainNode1.connect(audioCtx.destination);
|
||||
oscillator1.type = "sine"; // 'sine' 'square', 'sawtooth', 'triangle' and 'custom'
|
||||
oscillator1.frequency.value = frequency; // value in hertz
|
||||
oscillator1.start();
|
||||
for (let i = 0, len = end * 0.1; i < len; i++) {
|
||||
oscillator1.frequency.setValueAtTime(frequency + i * 10, audioCtx.currentTime + i * 0.01);
|
||||
}
|
||||
setTimeout(() => {
|
||||
audioCtx.suspend()
|
||||
audioCtx.close()
|
||||
}, end)
|
||||
return audioCtx
|
||||
}
|
||||
tone(50)
|
||||
tone(83.333)
|
||||
tone(166.666)
|
||||
sound.portamento(50)
|
||||
sound.portamento(83.333)
|
||||
sound.portamento(166.666)
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user