normalize and compress all sfx, read sfx list from pastebin
This commit is contained in:
309
discord.js
309
discord.js
@@ -1,28 +1,29 @@
|
||||
// Import modules
|
||||
const { Client } = require('discord.js'),
|
||||
fs = require('fs'),
|
||||
path = require('path'),
|
||||
moment = require('moment'),
|
||||
timers = require('./lib/timers.js'),
|
||||
staticCommands = require('./lib/static-commands.js'),
|
||||
const { Client } = require("discord.js"),
|
||||
fs = require("fs"),
|
||||
path = require("path"),
|
||||
axios = require("axios"),
|
||||
moment = require("moment"),
|
||||
timers = require("./lib/timers.js"),
|
||||
staticCommands = require("./lib/static-commands.js"),
|
||||
//cooldowns = require('./lib/cooldowns.js'),
|
||||
ankhbotCommands = require('./lib/ankhbot-commands.js'),
|
||||
config = require('./config.json');
|
||||
ankhbotCommands = require("./lib/ankhbot-commands.js"),
|
||||
config = require("./config.json");
|
||||
|
||||
// Set up Discord client
|
||||
const client = new Client();
|
||||
|
||||
// Set up SFX
|
||||
const sfxFilePath = path.join(__dirname, 'sfx');
|
||||
const sfxFilePath = path.join(__dirname, "sfx");
|
||||
const allowedSfxChannels = new RegExp(config.allowedSfxChannels);
|
||||
let playOptions = {volume: config.sfxVolume, passes: config.passes};
|
||||
let playOptions = { volume: config.sfxVolume, passes: config.passes };
|
||||
let playing = false;
|
||||
|
||||
// Read in sfx directory, filenames are the commands
|
||||
let sfxList = readSfxDirectory(sfxFilePath);
|
||||
// Watch directory for changes and update the list
|
||||
fs.watch(sfxFilePath, (eventType, filename) => {
|
||||
if (eventType === 'rename') {
|
||||
if (eventType === "rename") {
|
||||
sfxList = readSfxDirectory(sfxFilePath);
|
||||
}
|
||||
});
|
||||
@@ -30,7 +31,7 @@ fs.watch(sfxFilePath, (eventType, filename) => {
|
||||
// @todo DRY this shit up
|
||||
|
||||
// Read in fun facts
|
||||
const funFactsFilePath = path.join(__dirname, 'conf', 'funfacts');
|
||||
const funFactsFilePath = path.join(__dirname, "conf", "funfacts");
|
||||
let funFacts = parseLines(funFactsFilePath);
|
||||
fs.watchFile(funFactsFilePath, (curr, prev) => {
|
||||
if (curr.mtime !== prev.mtime) {
|
||||
@@ -39,7 +40,7 @@ fs.watchFile(funFactsFilePath, (curr, prev) => {
|
||||
});
|
||||
|
||||
// Read in ham facts
|
||||
const hamFactsFilePath = path.join(__dirname, 'conf', 'hamfacts');
|
||||
const hamFactsFilePath = path.join(__dirname, "conf", "hamfacts");
|
||||
let hamFacts = parseLines(hamFactsFilePath);
|
||||
fs.watchFile(hamFactsFilePath, (curr, prev) => {
|
||||
if (curr.mtime !== prev.mtime) {
|
||||
@@ -49,107 +50,139 @@ fs.watchFile(hamFactsFilePath, (curr, prev) => {
|
||||
|
||||
// Set up the native commands to handle
|
||||
const commands = {
|
||||
'sfx': (msg, disconnectAfter) => {
|
||||
sfx: (msg, disconnectAfter) => {
|
||||
if (!allowedSfxChannels.test(msg.channel.name)) return;
|
||||
let sfx = msg.content.split(' ')[1];
|
||||
if (sfx == '' || sfx === undefined) return msg.channel.send('```'+sfxList.join(', ')+'```');
|
||||
let sfx = msg.content.split(" ")[1];
|
||||
|
||||
if (playing === true) return msg.channel.send('Already playing, please wait.');
|
||||
// retrieve sfx list from pastebin
|
||||
if (sfx == "" || sfx === undefined) {
|
||||
axios
|
||||
.get("https://pastebin.com/raw/vRsZxrrw")
|
||||
.then(res => {
|
||||
return msg.channel.send("```" + res.data + "```");
|
||||
})
|
||||
.catch(console.error);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (playing === true)
|
||||
return msg.channel.send("Already playing, please wait.");
|
||||
|
||||
// make sure this file exists either as an mp3 or wav
|
||||
let sfxPath;
|
||||
if (fs.existsSync(path.join(sfxFilePath, sfx + '.mp3'))) {
|
||||
sfxPath = path.join(sfxFilePath, sfx + '.mp3');
|
||||
} else if (fs.existsSync(path.join(sfxFilePath, sfx + '.wav'))) {
|
||||
sfxPath = path.join(sfxFilePath, sfx + '.wav');
|
||||
if (fs.existsSync(path.join(sfxFilePath, sfx + ".mp3"))) {
|
||||
sfxPath = path.join(sfxFilePath, sfx + ".mp3");
|
||||
} else if (fs.existsSync(path.join(sfxFilePath, sfx + ".wav"))) {
|
||||
sfxPath = path.join(sfxFilePath, sfx + ".wav");
|
||||
} else {
|
||||
return msg.reply('This sound effect does not exist!');
|
||||
return msg.reply("This sound effect does not exist!");
|
||||
}
|
||||
|
||||
if (!msg.guild.voiceConnection) return joinVoiceChannel(msg).then(() => commands.sfx(msg, disconnectAfter));
|
||||
if (!msg.guild.voiceConnection)
|
||||
return joinVoiceChannel(msg).then(() =>
|
||||
commands.sfx(msg, disconnectAfter)
|
||||
);
|
||||
|
||||
disconnectAfter = (typeof disconnectAfter !== "undefined") ? disconnectAfter : true;
|
||||
disconnectAfter =
|
||||
typeof disconnectAfter !== "undefined" ? disconnectAfter : true;
|
||||
|
||||
playing = true;
|
||||
(function play(sfxFile) {
|
||||
const dispatcher = msg.guild.voiceConnection.playFile(sfxFile, playOptions);
|
||||
dispatcher.on('end', reason => {
|
||||
playing = false;
|
||||
if (disconnectAfter) msg.guild.voiceConnection.disconnect();
|
||||
})
|
||||
.on('error', error => {
|
||||
playing = false;
|
||||
if (disconnectAfter) msg.guild.voiceConnection.disconnect();
|
||||
})
|
||||
.on('start', () => {});
|
||||
const dispatcher = msg.guild.voiceConnection.playFile(
|
||||
sfxFile,
|
||||
playOptions
|
||||
);
|
||||
dispatcher
|
||||
.on("end", reason => {
|
||||
playing = false;
|
||||
if (disconnectAfter) msg.guild.voiceConnection.disconnect();
|
||||
})
|
||||
.on("error", error => {
|
||||
playing = false;
|
||||
if (disconnectAfter) msg.guild.voiceConnection.disconnect();
|
||||
})
|
||||
.on("start", () => {});
|
||||
})(sfxPath.toString());
|
||||
},
|
||||
'funfact': (msg) => {
|
||||
funfact: msg => {
|
||||
if (funFacts.length > 0) {
|
||||
// return random element from funFacts, unless one is specifically requested
|
||||
let el;
|
||||
let req = parseInt(msg.content.split(' ')[1]);
|
||||
if (Number.isNaN(req) || typeof funFacts[req-1] === 'undefined') {
|
||||
let req = parseInt(msg.content.split(" ")[1]);
|
||||
if (Number.isNaN(req) || typeof funFacts[req - 1] === "undefined") {
|
||||
el = Math.floor(Math.random() * funFacts.length);
|
||||
} else {
|
||||
el = req - 1;
|
||||
}
|
||||
|
||||
let displayNum = (el+1).toString();
|
||||
let funFact = funFacts[el]
|
||||
msg.channel.send({embed: {
|
||||
"title": "FunFact #"+displayNum,
|
||||
"color": 0x21c629,
|
||||
"description": funFact
|
||||
}}).catch(console.error);
|
||||
let displayNum = (el + 1).toString();
|
||||
let funFact = funFacts[el];
|
||||
msg.channel
|
||||
.send({
|
||||
embed: {
|
||||
title: "FunFact #" + displayNum,
|
||||
color: 0x21c629,
|
||||
description: funFact
|
||||
}
|
||||
})
|
||||
.catch(console.error);
|
||||
} else {
|
||||
msg.channel.send("No fun facts found!");
|
||||
}
|
||||
},
|
||||
'hamfact': (msg) => {
|
||||
hamfact: msg => {
|
||||
if (hamFacts.length > 0) {
|
||||
// return random element from hamFacts, unless one is specifically requested
|
||||
let el;
|
||||
let req = parseInt(msg.content.split(' ')[1]);
|
||||
if (Number.isNaN(req) || typeof hamFacts[req-1] === 'undefined') {
|
||||
let req = parseInt(msg.content.split(" ")[1]);
|
||||
if (Number.isNaN(req) || typeof hamFacts[req - 1] === "undefined") {
|
||||
el = Math.floor(Math.random() * hamFacts.length);
|
||||
} else {
|
||||
el = req - 1;
|
||||
}
|
||||
|
||||
let displayNum = (el+1).toString();
|
||||
let hamFact = hamFacts[el]
|
||||
msg.channel.send({embed: {
|
||||
"title": "HamFact #"+displayNum,
|
||||
"color": 0x21c629,
|
||||
"description": hamFact
|
||||
}}).catch(console.error);
|
||||
let displayNum = (el + 1).toString();
|
||||
let hamFact = hamFacts[el];
|
||||
msg.channel
|
||||
.send({
|
||||
embed: {
|
||||
title: "HamFact #" + displayNum,
|
||||
color: 0x21c629,
|
||||
description: hamFact
|
||||
}
|
||||
})
|
||||
.catch(console.error);
|
||||
} else {
|
||||
msg.channel.send("No ham facts found!");
|
||||
}
|
||||
},
|
||||
'dance': (msg) => {
|
||||
msg.channel.send("*┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛*");
|
||||
dance: msg => {
|
||||
msg.channel.send(
|
||||
"*┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛*"
|
||||
);
|
||||
},
|
||||
'join': (msg) => {
|
||||
if (!msg.guild.voiceConnection) {
|
||||
joinVoiceChannel(msg).then(() => {
|
||||
//
|
||||
}).catch(console.error);
|
||||
join: msg => {
|
||||
if (!msg.guild.voiceConnection) {
|
||||
joinVoiceChannel(msg)
|
||||
.then(() => {
|
||||
//
|
||||
})
|
||||
.catch(console.error);
|
||||
} else {
|
||||
return msg.reply(`I'm already in a voice channel!`);
|
||||
}
|
||||
},
|
||||
'leave': (msg) => {
|
||||
if (msg.guild.voiceConnection) {
|
||||
msg.content = '!sfx bye';
|
||||
leave: msg => {
|
||||
if (msg.guild.voiceConnection) {
|
||||
msg.content = "!sfx bye";
|
||||
commands.sfx(msg);
|
||||
//msg.guild.voiceConnection.disconnect();
|
||||
} else {
|
||||
return msg.reply(`If ya don't eat your meat, ya can't have any pudding!`);
|
||||
}
|
||||
},
|
||||
'listen': (msg) => {
|
||||
listen: msg => {
|
||||
// listen for a particular member to speak and respond appropriately
|
||||
if (msg.guild.voiceConnection) {
|
||||
// get the guild member
|
||||
@@ -160,103 +193,125 @@ const commands = {
|
||||
let listenInterval = 1000;
|
||||
setInterval(() => {
|
||||
if (guildMember.speaking === true) {
|
||||
msg.content = '!sfx stfu';
|
||||
msg.content = "!sfx stfu";
|
||||
commands.sfx(msg, false);
|
||||
}
|
||||
}, listenInterval);
|
||||
} else {
|
||||
console.error(`Could not find specified guild member: ${guildMemberId}!`);
|
||||
console.error(
|
||||
`Could not find specified guild member: ${guildMemberId}!`
|
||||
);
|
||||
msg.guild.voiceConnection.disconnect();
|
||||
}
|
||||
} else {
|
||||
// join the voice channel then call this command again
|
||||
joinVoiceChannel(msg).then(() => {
|
||||
commands.listen(msg);
|
||||
}).catch(console.error);
|
||||
joinVoiceChannel(msg)
|
||||
.then(() => {
|
||||
commands.listen(msg);
|
||||
})
|
||||
.catch(console.error);
|
||||
}
|
||||
},
|
||||
'reboot': (msg) => {
|
||||
reboot: msg => {
|
||||
if (msg.author.id == config.adminID) process.exit(); //Requires a node module like Forever to work.
|
||||
}
|
||||
};
|
||||
|
||||
// Wait for discord to be ready, handle messages
|
||||
client.on('ready', () => {
|
||||
console.log(`${config.botName} is connected and ready`);
|
||||
let botChannel = client.channels.find('name', config.botChannel);
|
||||
// Listen for commands for the bot to respond to across all channels
|
||||
}).on('message', msg => {
|
||||
msg.originalContent = msg.content;
|
||||
msg.content = msg.content.toLowerCase();
|
||||
client
|
||||
.on("ready", () => {
|
||||
console.log(`${config.botName} is connected and ready`);
|
||||
let botChannel = client.channels.find("name", config.botChannel);
|
||||
// Listen for commands for the bot to respond to across all channels
|
||||
})
|
||||
.on("message", msg => {
|
||||
msg.originalContent = msg.content;
|
||||
msg.content = msg.content.toLowerCase();
|
||||
|
||||
// Make sure it starts with the configured prefix
|
||||
if (!msg.content.startsWith(config.prefix)) return;
|
||||
// Make sure it starts with the configured prefix
|
||||
if (!msg.content.startsWith(config.prefix)) return;
|
||||
|
||||
// And that it's not on cooldown
|
||||
/*let cooldownKey = config.botName + msg.content + msg.channel.id;
|
||||
// And that it's not on cooldown
|
||||
/*let cooldownKey = config.botName + msg.content + msg.channel.id;
|
||||
cooldowns.get(cooldownKey, config.textCmdCooldown)
|
||||
.then(onCooldown => {
|
||||
if (onCooldown === false) {*/
|
||||
// Not on CD, check for native or static command
|
||||
let commandNoPrefix = msg.content.slice(config.prefix.length).split(' ')[0];
|
||||
console.log(`'${commandNoPrefix}' received in #${msg.channel.name} from @${msg.author.username}`);
|
||||
// Not on CD, check for native or static command
|
||||
let commandNoPrefix = msg.content.slice(config.prefix.length).split(" ")[0];
|
||||
console.log(
|
||||
`'${commandNoPrefix}' received in #${msg.channel.name} from @${msg.author.username}`
|
||||
);
|
||||
|
||||
// check for native command first
|
||||
if (commands.hasOwnProperty(commandNoPrefix)) {
|
||||
commands[commandNoPrefix](msg);
|
||||
// then a static command we've manually added
|
||||
} else if (staticCommands.exists(commandNoPrefix)) {
|
||||
let result = staticCommands.get(commandNoPrefix);
|
||||
msg.channel.send({embed: {
|
||||
"title": commandNoPrefix,
|
||||
"color": 0x21c629,
|
||||
"description": result
|
||||
}}).then(sentMessage => {}/*cooldowns.set(cooldownKey, config.textCmdCooldown)*/)
|
||||
.catch(console.error);
|
||||
// then a command exported from ankhbot
|
||||
} else if (ankhbotCommands.exists(commandNoPrefix)) {
|
||||
let result = ankhbotCommands.get(commandNoPrefix);
|
||||
msg.channel.send({embed: {
|
||||
"title": commandNoPrefix,
|
||||
"color": 0x21c629,
|
||||
"description": result
|
||||
}}).then(sentMessage => {}/*cooldowns.set(cooldownKey, config.textCmdCooldown)*/)
|
||||
.catch(console.error);
|
||||
} else {
|
||||
// Not a command we recognize, ignore
|
||||
}
|
||||
/*} else {
|
||||
// check for native command first
|
||||
if (commands.hasOwnProperty(commandNoPrefix)) {
|
||||
commands[commandNoPrefix](msg);
|
||||
// then a static command we've manually added
|
||||
} else if (staticCommands.exists(commandNoPrefix)) {
|
||||
let result = staticCommands.get(commandNoPrefix);
|
||||
msg.channel
|
||||
.send({
|
||||
embed: {
|
||||
title: commandNoPrefix,
|
||||
color: 0x21c629,
|
||||
description: result
|
||||
}
|
||||
})
|
||||
.then(
|
||||
sentMessage => {} /*cooldowns.set(cooldownKey, config.textCmdCooldown)*/
|
||||
)
|
||||
.catch(console.error);
|
||||
// then a command exported from ankhbot
|
||||
} else if (ankhbotCommands.exists(commandNoPrefix)) {
|
||||
let result = ankhbotCommands.get(commandNoPrefix);
|
||||
msg.channel
|
||||
.send({
|
||||
embed: {
|
||||
title: commandNoPrefix,
|
||||
color: 0x21c629,
|
||||
description: result
|
||||
}
|
||||
})
|
||||
.then(
|
||||
sentMessage => {} /*cooldowns.set(cooldownKey, config.textCmdCooldown)*/
|
||||
)
|
||||
.catch(console.error);
|
||||
} else {
|
||||
// Not a command we recognize, ignore
|
||||
}
|
||||
/*} else {
|
||||
// DM the user that it's on CD
|
||||
dmUser(msg, `**${msg.content}** is currently on cooldown for another *${onCooldown} seconds!*`);
|
||||
}
|
||||
})
|
||||
.catch(console.error);*/
|
||||
}).login(config.d_token);
|
||||
})
|
||||
.login(config.d_token);
|
||||
|
||||
function readSfxDirectory(path)
|
||||
{
|
||||
function readSfxDirectory(path) {
|
||||
let sfxList = fs.readdirSync(sfxFilePath);
|
||||
sfxList.forEach(function(el, index, a) {
|
||||
a[index] = el.split('.')[0];
|
||||
a[index] = el.split(".")[0];
|
||||
});
|
||||
return sfxList;
|
||||
}
|
||||
|
||||
function joinVoiceChannel(msg)
|
||||
{
|
||||
function joinVoiceChannel(msg) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const voiceChannel = msg.member.voiceChannel;
|
||||
if (!voiceChannel || voiceChannel.type !== 'voice') return msg.reply('I couldn\'t connect to your voice channel...');
|
||||
voiceChannel.join().then(connection => resolve(connection)).catch(err => reject(err));
|
||||
if (!voiceChannel || voiceChannel.type !== "voice")
|
||||
return msg.reply("I couldn't connect to your voice channel...");
|
||||
voiceChannel
|
||||
.join()
|
||||
.then(connection => resolve(connection))
|
||||
.catch(err => reject(err));
|
||||
});
|
||||
}
|
||||
|
||||
// Read/parse text lines from a file
|
||||
function parseLines(filePath)
|
||||
{
|
||||
function parseLines(filePath) {
|
||||
let lines = [];
|
||||
let data = fs.readFileSync(filePath, 'utf-8');
|
||||
let splitLines = data.toString().split('\n');
|
||||
let data = fs.readFileSync(filePath, "utf-8");
|
||||
let splitLines = data.toString().split("\n");
|
||||
splitLines.forEach(function(line) {
|
||||
if (line.length > 0) {
|
||||
lines.push(line);
|
||||
@@ -265,13 +320,13 @@ function parseLines(filePath)
|
||||
return lines;
|
||||
}
|
||||
|
||||
function dmUser(originalMessage, newMessage)
|
||||
{
|
||||
function dmUser(originalMessage, newMessage) {
|
||||
// check that this isn't already a DM before sending
|
||||
if (originalMessage.channel.type === 'dm') {
|
||||
if (originalMessage.channel.type === "dm") {
|
||||
originalMessage.channel.send(newMessage);
|
||||
} else {
|
||||
originalMessage.member.createDM()
|
||||
originalMessage.member
|
||||
.createDM()
|
||||
.then(channel => {
|
||||
channel.send(newMessage);
|
||||
})
|
||||
@@ -280,4 +335,4 @@ function dmUser(originalMessage, newMessage)
|
||||
}
|
||||
|
||||
// catch Promise errors
|
||||
process.on('unhandledRejection', console.error);
|
||||
process.on("unhandledRejection", console.error);
|
||||
|
||||
108
fgfm.TODO
108
fgfm.TODO
@@ -1,108 +0,0 @@
|
||||
TODO:
|
||||
☐ Web interface for viewers to issue commands
|
||||
☐ Organized room / video list, one-click add-to-queue
|
||||
☐ Admin panel on website for control
|
||||
☐ Add support for a command to mute/unmute audio sources
|
||||
☐ Don't re-create queue on start if it already exists
|
||||
☐ Handle socket disconnect
|
||||
☐ Decouple twitch chat from GHOBS
|
||||
☐ Move anything that calls director.state from app into fgfm lib
|
||||
☐ Restrict # of requests a user can have in the queue at once
|
||||
☐ Room vid requests / import
|
||||
☐ Improved interface for viewer requests
|
||||
☐ Web interface? Twitch extension?
|
||||
☐ Improvements
|
||||
☐ When playing a room back, loop it at slower speeds for a few iterations
|
||||
☐ Support adding sets of videos to the queue at once (like the entire ttas or all gold segments)
|
||||
☐ Tool to output list of video ID's / descriptions
|
||||
☐ Stream alerts for chat
|
||||
☐ Rotating background images (leftside)
|
||||
☐ Support gif's via command through gifph
|
||||
- !slowdance
|
||||
- !bender
|
||||
- !carlton
|
||||
- !weeb
|
||||
☐ Fix commercial playing issue (switches back to scene early)
|
||||
☐ Change $auw and $meme to queue up the videos just like the others (don't switch scenes)
|
||||
☐ Stats tracking for games
|
||||
☐ Most won/lost gambling
|
||||
☐ Most trivia answered
|
||||
☐ Last time jackpot was hit
|
||||
☐ Allow %'s for !gamble
|
||||
☐ Make a separate twitch user for the stream bot
|
||||
|
||||
Ideas:
|
||||
|
||||
StreamWebRemote:
|
||||
- OBS Websocket Connection Mgmt
|
||||
- Stream Start/Stop/Restart
|
||||
- Video Queue Mgmt
|
||||
- Video DB Mgmt
|
||||
Users:
|
||||
- use twitch login
|
||||
- video requests
|
||||
- room requests
|
||||
|
||||
___________________
|
||||
Archive:
|
||||
✔ Spotify integration @done (18-12-28 17:46) @project(TODO)
|
||||
✔ shuffle on/off @done (18-12-11 11:22) @project(TODO)
|
||||
✔ repeat mode control @done (18-12-11 11:22) @project(TODO)
|
||||
✔ ability to change the playlist (setplaylist <spotify-uri>) @done (18-12-11 10:52) @project(TODO)
|
||||
✔ volume -- volume adjustment @done (18-12-04 19:49) @project(TODO)
|
||||
✔ pause / resume @done (18-12-04 11:49) @project(TODO)
|
||||
✔ skip -- mods auto-skip @done (18-12-04 11:47) @project(TODO)
|
||||
✔ song -- display current song + link @done (18-12-04 11:24) @project(TODO)
|
||||
✔ playlist -- display current context / album @done (18-12-04 11:24) @project(TODO)
|
||||
✔ Stop @done (18-11-06 21:54) @project(TODO)
|
||||
✔ video starting/ending/skipped @done (18-11-06 21:53) @project(TODO)
|
||||
✔ show status changing @done (18-11-06 21:53) @project(TODO)
|
||||
✔ Have director emit events for bots to listen to @done (18-11-06 21:53) @project(TODO)
|
||||
✔ Auto-enable vrmode timer when show starts (listen for event) @done (18-11-06 21:53) @project(TODO)
|
||||
✔ hide sources before switching to credits @done (18-11-06 21:41) @project(TODO)
|
||||
✔ Support a delay for Start Streaming @done (18-11-06 21:41) @project(TODO)
|
||||
✔ Add a $rooms alias for $room @done (18-11-06 15:05) @project(TODO)
|
||||
✔ Remove currently playing video from vote choices @done (18-10-30 11:51) @project(TODO)
|
||||
✔ track votes for the current playing video @done (18-10-30 11:48) @project(TODO)
|
||||
✔ if threshold is met, skip @done (18-10-30 11:48) @project(TODO)
|
||||
✔ config item for how many votes are required to skip @done (18-10-30 11:48) @project(TODO)
|
||||
✔ clear votes after video finishes @done (18-10-30 11:48) @project(TODO)
|
||||
✔ Support viewer $skip voting @done (18-10-30 11:48) @project(TODO)
|
||||
✔ update director showStatus to 'PAUSED' @done (18-10-30 11:33) @project(TODO)
|
||||
✔ have nextVideo check for PAUSED @done (18-10-30 11:33) @project(TODO)
|
||||
✔ Support for $pause (pauses queue after current video finishes) @done (18-10-30 11:33) @project(TODO)
|
||||
✔ Move vrmode timer to this bot, delete from SLCB @done (18-10-30 11:20) @project(TODO)
|
||||
✔ Don't auto-init GHOBS or FGFM, make them on-demand @done (18-10-30 08:26) @project(TODO)
|
||||
✔ Switch to credits with 1 minute remaining @done (18-10-30 08:15) @project(TODO)
|
||||
✔ Stop Stream @done (18-10-30 08:15) @project(TODO)
|
||||
✔ Stop @done (18-10-30 08:15) @project(TODO)
|
||||
✔ Parameter for how long until the stream should end @done (18-10-30 08:15) @project(TODO)
|
||||
✔ Fade out audio sources with 5 seconds left @done (18-10-30 08:15) @project(TODO)
|
||||
✔ Add parameter for countdown @done (18-10-30 08:15) @project(TODO)
|
||||
✔ Set up the queue upon init so it can be managed during startup @done (18-10-30 08:14) @project(TODO)
|
||||
✔ Starting Soon is shown until countdown is triggered @done (18-10-26 09:44) @project(TODO)
|
||||
✔ Start stream @done (18-10-26 09:44) @project(TODO)
|
||||
✔ Add cooldowns @done (18-10-02 10:16) @project(TODO)
|
||||
✔ video length @done (18-09-28 09:33) @project(TODO)
|
||||
✔ root folder name @done (18-09-28 09:33) @project(TODO)
|
||||
✔ room ID @done (18-09-28 09:33) @project(TODO)
|
||||
✔ original file name @done (18-09-28 09:33) @project(TODO)
|
||||
✔ keywords @done (18-09-28 09:33) @project(TODO)
|
||||
✔ dungeon (parse from root folder name) @done (18-09-28 09:33) @project(TODO)
|
||||
✔ Store the following as metadata: @done (18-09-28 09:33) @project(TODO)
|
||||
✔ Read the Y:\media\videos\ALttP\my-vids\room-vids directory @done (18-09-28 09:33) @project(TODO)
|
||||
✔ Go through each folder and get all the .mp4 files @done (18-09-28 09:33) @project(TODO)
|
||||
✔ Look into just making the video loop instead of hiding at the end @done (18-09-26 18:29) @project(TODO)
|
||||
✔ specify # of loops in video object @done (18-09-26 18:28) @project(TODO)
|
||||
✔ change source to loop? calculate time? @done (18-09-26 18:28) @project(TODO)
|
||||
✔ Update the queue to support looping @done (18-09-26 18:28) @project(TODO)
|
||||
✔ Fix queue to only return first 20 or so @done (18-09-26 12:04) @project(TODO)
|
||||
✔ Importing @done (18-09-26 08:25) @project(TODO)
|
||||
✔ Move vods to their own config @done (18-09-25 15:40) @project(TODO)
|
||||
✔ Modularize OBS and Twitch code @done (18-09-25 15:39) @project(TODO)
|
||||
✔ Ability to include/exclude vods from shuffle in config @done (18-09-25 15:39) @project(TODO)
|
||||
✔ Add random chance for room grind playlist to show for certain amount of time @done (18-09-21 12:28) @project(TODO)
|
||||
✔ show commercials after a video length cap is hit -- show at conclusion of video @done (18-09-19 11:11) @project(TODO)
|
||||
✔ add memes to commercial scene @done (18-09-19 11:11) @project(TODO)
|
||||
✔ add $setcurrent support (to update text label through obs websocket instead of chat) @done (18-09-17 18:06) @project(TODO)
|
||||
✔ remember the last X vids played, remove these from shuffle choices @done (18-09-17 14:34) @project(TODO)
|
||||
730
fgfm.js
730
fgfm.js
@@ -1,730 +0,0 @@
|
||||
/**
|
||||
* FG.fm Automation
|
||||
*/
|
||||
|
||||
// Import 3rd party packages
|
||||
const irc = require('irc');
|
||||
const schedule = require('node-schedule');
|
||||
const md5 = require('md5');
|
||||
const moment = require('moment');
|
||||
|
||||
// Import local packages
|
||||
const GHOBS = require('./lib/ghobs');
|
||||
const FGFM = require('./lib/fgfm');
|
||||
const cooldowns = require('./lib/cooldowns');
|
||||
const util = require('./lib/util');
|
||||
const Spotify = require('./lib/spotify');
|
||||
|
||||
// Read internal configuration
|
||||
let config = require('./config.json');
|
||||
config.vods = require(config.vodConfigFile);
|
||||
config.rooms = require(config.roomConfigFile);
|
||||
let snesGames = require('./conf/snesgames.json');
|
||||
let timersList = require('./conf/timers.json');
|
||||
|
||||
let activeTimers = [];
|
||||
let skipVote = {target: null, count: 0};
|
||||
|
||||
// Main screen turn on
|
||||
const obs = new GHOBS(config);
|
||||
obs.init()
|
||||
.then(() => twitchInit(config.twitch))
|
||||
.then(twitch => streamInit(config, twitch))
|
||||
.catch(console.error);
|
||||
|
||||
// Connect to twitch, set up basic event listeners
|
||||
const twitchInit = (config) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
let controlRoom = `#chatrooms:${config.channelId}:${config.controlRoomId}`;
|
||||
|
||||
console.log(`Connecting to Twitch / ${config.channel} / ${controlRoom}`);
|
||||
|
||||
let defaultTwitchConfig = {
|
||||
autoRejoin: true,
|
||||
retryCount: 10,
|
||||
channels: [config.channel, controlRoom],
|
||||
debug: config.debug
|
||||
};
|
||||
|
||||
// Connect to Twitch with the bot account
|
||||
let botChat = new irc.Client(
|
||||
config.ircServer,
|
||||
config.botLogin.username,
|
||||
Object.assign({password: config.botLogin.oauth}, defaultTwitchConfig)
|
||||
);
|
||||
|
||||
// Connect to Twitch with an editor account
|
||||
let editorChat = new irc.Client(
|
||||
config.ircServer,
|
||||
config.editorLogin.username,
|
||||
Object.assign({password: config.editorLogin.oauth}, defaultTwitchConfig)
|
||||
);
|
||||
|
||||
let twitchErrorHandler = message => {
|
||||
if (message.command != 'err_unknowncommand') {
|
||||
console.error('Error from Twitch IRC Server: ', message);
|
||||
}
|
||||
};
|
||||
|
||||
// Set up bare minimum event listeners for Twitch
|
||||
botChat.addListener('error', twitchErrorHandler);
|
||||
editorChat.addListener('error', twitchErrorHandler);
|
||||
|
||||
resolve({"botChat": botChat, "editorChat": editorChat, "controlRoom": controlRoom});
|
||||
});
|
||||
};
|
||||
|
||||
// Initialize Stream automation
|
||||
const streamInit = (config, twitch) => {
|
||||
|
||||
// All your comfy are belong to us
|
||||
const director = new FGFM({config: config, obs: obs});
|
||||
|
||||
// Handle show events from the director
|
||||
director.on('SHOW_STARTED', () => {
|
||||
manageTimer('vr', 'on');
|
||||
});
|
||||
director.on('SHOW_PAUSED', () => {
|
||||
manageTimer('vr', 'off');
|
||||
});
|
||||
director.on('SHOW_RESUMED', () => {
|
||||
manageTimer('vr', 'on');
|
||||
});
|
||||
|
||||
director.on('SHOW_ENDING', (secondsUntilCredits) => {
|
||||
manageTimer('vr', 'off');
|
||||
|
||||
// Let the chat know the stream is ending soon
|
||||
twitch.botChat.say(config.twitch.channel, `The stream will be ending in ${parseFloat(secondsUntilCredits/60).toFixed(0)} minutes!`);
|
||||
});
|
||||
|
||||
director.on('CREDITS_SHOWN', (secondsUntilEnd) => {
|
||||
twitch.editorChat.say(config.twitch.channel, `Thanks to everyone for watching and lurking! Have a wonderful night and stay comfy. greenhComfy`);
|
||||
});
|
||||
|
||||
// Spotify integration
|
||||
const spotify = new Spotify(config.spotify);
|
||||
spotify.init();
|
||||
|
||||
// Chat commands
|
||||
const commands = {
|
||||
admin: {
|
||||
|
||||
init: (cmd) => {
|
||||
let streamStartDelaySeconds = cmd.args[1] || 1;
|
||||
let showStartDelaySeconds = cmd.args[2] || 300;
|
||||
|
||||
director.startingSoon(streamStartDelaySeconds, showStartDelaySeconds);
|
||||
},
|
||||
|
||||
|
||||
start: (cmd) => {
|
||||
director.startTheShow();
|
||||
},
|
||||
|
||||
|
||||
end: (cmd) => {
|
||||
let creditsDelay = cmd.args[1] || 1;
|
||||
let endDelay = cmd.args[2] || 60;
|
||||
director.endTheShow(creditsDelay, endDelay);
|
||||
},
|
||||
|
||||
|
||||
changevis: (cmd, newVisibility) => {
|
||||
let sceneItem = command.args[1] || false;
|
||||
if (!sceneItem) {
|
||||
twitch.botChat.say(cmd.to, `A scene item name is required!`);
|
||||
return;
|
||||
}
|
||||
|
||||
let sceneOrGroup = command.args[2] || obs.currentScene;
|
||||
obs.setVisible(sceneItem, sceneOrGroup, newVisibility).catch(console.error);
|
||||
},
|
||||
|
||||
|
||||
show: (cmd) => {
|
||||
commands.admin.changevis(cmd, true);
|
||||
},
|
||||
|
||||
|
||||
hide: (cmd) => {
|
||||
commands.admin.changevis(cmd, false);
|
||||
},
|
||||
|
||||
|
||||
t: (cmd) => {
|
||||
let sceneItem = cmd.args[1] || false;
|
||||
if (!sceneItem) {
|
||||
twitch.botChat.say(cmd.to, `A scene item name is required!`);
|
||||
return;
|
||||
}
|
||||
|
||||
obs.toggleVisible(sceneItem).catch(console.error);
|
||||
},
|
||||
|
||||
|
||||
timer: (cmd) => {
|
||||
let timerName = cmd.args[1] || false;
|
||||
if (!timerName) {
|
||||
twitch.botChat.say(cmd.to, `A timer name is required!`);
|
||||
return;
|
||||
}
|
||||
|
||||
let timerStatus = cmd.args[2] || false;
|
||||
|
||||
try {
|
||||
manageTimer(timerName, timerStatus);
|
||||
} catch (e) {
|
||||
twitch.botChat.say(cmd.to, e);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
auw: (cmd) => {
|
||||
director.showMeme('auw');
|
||||
},
|
||||
|
||||
|
||||
meme: (cmd) => {
|
||||
let memeId = cmd.args[1] || false;
|
||||
if (memeId) {
|
||||
console.log(`${memeId} meme requested by ${cmd.from}`);
|
||||
if ( config.vods.memes.findIndex(e => e.id === memeId) === -1) {
|
||||
twitch.botChat.say(cmd.to, `No meme with that ID exists!`);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
memeId = config.vods.memes.sort(util.randSort)[0].id;
|
||||
console.log(`${memeId} meme randomly selected`);
|
||||
}
|
||||
|
||||
director.showMeme(memeId);
|
||||
},
|
||||
|
||||
|
||||
switch: (cmd) => {
|
||||
let newScene = cmd.args[1] || false;
|
||||
if (!newScene) {
|
||||
twitch.botChat.say(cmd.to, `A scene name is required!`);
|
||||
return;
|
||||
}
|
||||
|
||||
obs.switchToScene(newScene).catch(console.error);
|
||||
},
|
||||
|
||||
|
||||
setact: (cmd) => {
|
||||
let newActivity = cmd.args.slice(1).join(' ');
|
||||
if (!newActivity) {
|
||||
twitch.botChat.say(cmd.to, `Please provide a new activity`);
|
||||
return;
|
||||
}
|
||||
|
||||
obs.showActivity(newActivity).catch(console.error);
|
||||
},
|
||||
|
||||
|
||||
showact: (cmd) => {
|
||||
obs.showActivity().catch(console.error);
|
||||
},
|
||||
|
||||
|
||||
hideact: (cmd) => {
|
||||
obs.hideActivity().catch(console.error);
|
||||
},
|
||||
|
||||
|
||||
add: (cmd) => {
|
||||
// @TODO: DRY this out with the checks in vr
|
||||
let requestedVideoId = cmd.args[1] || false;
|
||||
if (requestedVideoId === false) {
|
||||
twitch.botChat.say(cmd.to, `Missing video ID`);
|
||||
return;
|
||||
}
|
||||
|
||||
// make sure request vid isn't in the queue already
|
||||
// @TODO: Move into FGFM
|
||||
if (director.state.videoQueue.findIndex(e => e.id == requestedVideoId) !== -1) {
|
||||
twitch.botChat.say(cmd.to, `That video is in the queue already!`);
|
||||
return;
|
||||
}
|
||||
|
||||
// search for req'd vid by id in config.vods.alttp
|
||||
let vodIndex = config.vods.alttp.findIndex(e => e.id == requestedVideoId);
|
||||
if (vodIndex === -1) {
|
||||
twitch.botChat.say(cmd.to, `A video with that ID does not exist!`);
|
||||
return;
|
||||
}
|
||||
|
||||
// add to queue if it exists
|
||||
// @TODO: Move into FGFM
|
||||
if (director.addVideo(config.vods.alttp[vodIndex])) {
|
||||
twitch.botChat.say(cmd.to, `${config.vods.alttp[vodIndex].chatName} has been added to the queue [${director.state.videoQueue.length}]`);
|
||||
} else {
|
||||
twitch.botChat.say(cmd.to, `Video could not be added to queue!`);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
skip: (cmd) => {
|
||||
director.skip();
|
||||
},
|
||||
|
||||
|
||||
pause: (cmd) => {
|
||||
director.pause();
|
||||
},
|
||||
|
||||
|
||||
resume: (cmd) => {
|
||||
director.resume();
|
||||
},
|
||||
|
||||
|
||||
clear: (cmd) => {
|
||||
director.clearQueue();
|
||||
},
|
||||
|
||||
|
||||
startvote: (cmd) => {
|
||||
videoVoteJob.reschedule(`*/${config.videoPollIntervalMinutes} * * * *`);
|
||||
twitch.botChat.say(cmd.to, `Video Queue Voting will start in ${config.videoPollIntervalMinutes} minutes!`);
|
||||
},
|
||||
|
||||
|
||||
pausevote: (cmd) => {
|
||||
clearInterval(rtvInterval);
|
||||
videoVoteJob.cancel();
|
||||
twitch.botChat.say(cmd.to, `Video Queue Voting has been paused.`);
|
||||
},
|
||||
|
||||
|
||||
songskip: (cmd) => {
|
||||
spotify.skip();
|
||||
},
|
||||
|
||||
songpause: (cmd) => {
|
||||
spotify.pause();
|
||||
},
|
||||
|
||||
songresume: (cmd) => {
|
||||
spotify.resume();
|
||||
},
|
||||
|
||||
songvol: (cmd) => {
|
||||
let volume = parseInt(cmd.args[1]) || 100;
|
||||
spotify.setVolume(volume)
|
||||
.then(res => twitch.botChat.say(cmd.to, `Volume set to ${volume}`))
|
||||
.catch(err => twitch.botChat.say(cmd.to, `Error setting spotify volume: ${JSON.stringify(err)}`));
|
||||
},
|
||||
|
||||
songplay: (cmd) => {
|
||||
let url = cmd.args[1] || false;
|
||||
if (url === false) {
|
||||
return twitch.botChat.say(cmd.to, `You must provide a link to a spotify playlist or album!`);
|
||||
}
|
||||
|
||||
// parse+validate url
|
||||
let spotifyUri = false;
|
||||
|
||||
// check for native spotify URI first
|
||||
if (url.includes('spotify:')) {
|
||||
let parsedUrl = url.match(/spotify:(playlist|album):([A-Za-z0-9]{22})/);
|
||||
if (parsedUrl !== null) {
|
||||
spotifyUri = parsedUrl[0];
|
||||
}
|
||||
} else if (url.includes('spotify.com')) {
|
||||
// determine if it's an album or playlist
|
||||
if (!url.includes('/playlist/') && !url.includes('/album/')) {
|
||||
return twitch.botChat.say(cmd.to, `Spotify URL must be a playlist or album!`);
|
||||
}
|
||||
|
||||
// parse the URL to get the resource type and ID
|
||||
let parsedUrl = url.match(/(playlist|album)\/([A-Za-z0-9]{22})/);
|
||||
if (parsedUrl !== null) {
|
||||
spotifyUri = `spotify:${parsedUrl[1]}:${parsedUrl[2]}`;
|
||||
} else {
|
||||
return twitch.botChat.say(cmd.to, `Unable to parse spotify URL!`);
|
||||
}
|
||||
} else {
|
||||
return twitch.botChat.say(cmd.to, `Invalid spotify URL!`);
|
||||
}
|
||||
|
||||
if (spotifyUri !== false) {
|
||||
spotify.playContext(spotifyUri)
|
||||
.then(res => twitch.botChat.say(cmd.to, `Changed playlist!`))
|
||||
.catch(err => twitch.botChat.say(cmd.to, `Error changing playlist: ${JSON.stringify(err)}`));
|
||||
} else {
|
||||
return twitch.botChat.say(cmd.to, `Unable to parse Spotify URL!`);
|
||||
}
|
||||
},
|
||||
|
||||
songshuffle: (cmd) => {
|
||||
let state = cmd.args[1] || true;
|
||||
|
||||
if (state === 'off' || state === 'false') {
|
||||
state = false;
|
||||
} else {
|
||||
state = true;
|
||||
}
|
||||
|
||||
spotify.shuffle(state)
|
||||
.then(res => twitch.botChat.say(cmd.to, `Updated shuffle state!`))
|
||||
.catch(err => twitch.botChat.say(cmd.to, `Error changing shuffle state: ${JSON.stringify(err)}`))
|
||||
},
|
||||
|
||||
songrepeat: (cmd) => {
|
||||
let state = cmd.args[1] || false;
|
||||
if (state === false) {
|
||||
return twitch.botChat.say(cmd.to, `You must provide a repeat mode (track, context, or off)!`);
|
||||
}
|
||||
|
||||
if (!['track', 'context', 'off'].includes(state)) {
|
||||
return twitch.botChat.say(cmd.to, `You must provide a valid repeat mode (track, context, or off)!`);
|
||||
}
|
||||
|
||||
spotify.repeat(state)
|
||||
.then(res => twitch.botChat.say(cmd.to, `Updated repeat mode!`))
|
||||
.catch(err => twitch.botChat.say(cmd.to, `Error changing repeat mode: ${JSON.stringify(err)}`))
|
||||
},
|
||||
|
||||
reboot: (cmd) => {
|
||||
console.log('Received request from admin to reboot...');
|
||||
twitch.botChat.say(cmd.to, 'Rebooting...');
|
||||
process.exit(0); // requires process manager with autoreboot to work
|
||||
}
|
||||
},
|
||||
|
||||
user: {
|
||||
|
||||
vote: (cmd) => {
|
||||
let userVote = cmd.args[1] || false;
|
||||
|
||||
if (userVote === false) {
|
||||
rockTheVote();
|
||||
return;
|
||||
}
|
||||
|
||||
userVote = Number.parseInt(userVote);
|
||||
|
||||
if (!Number.isInteger(userVote) || userVote < 1 || userVote > currentChoices.length) {
|
||||
return twitch.botChat.say(cmd.to, `@${from}, please choose an option from 1 - ${currentChoices.length}!`);
|
||||
}
|
||||
|
||||
// Check for uniqueness of vote
|
||||
// if it's not unique, update the vote
|
||||
let prevVote = userVotes.findIndex(e => e.from === from);
|
||||
if (prevVote !== -1) {
|
||||
if (userVotes[prevVote].vote !== userVote) {
|
||||
// update vote and inform the user
|
||||
userVotes[prevVote].vote = userVote;
|
||||
twitch.botChat.say(cmd.to, `@${from}, your vote has been updated!`);
|
||||
} else {
|
||||
twitch.botChat.say(cmd.to, `@${from}, your vote is already in!`);
|
||||
}
|
||||
} else {
|
||||
// log user vote
|
||||
userVotes.push({"from": from, "vote": userVote});
|
||||
twitch.botChat.say(cmd.to, `@${from}, your vote has been logged!`);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
queue: (cmd) => {
|
||||
// @TODO: Move into FGFM
|
||||
if (director.state.videoQueue.length > 0) {
|
||||
let chatQueue = director.state.videoQueue.slice(0, 10).map((c, i) => {
|
||||
return `[${i+1}] ${c.chatName}`;
|
||||
});
|
||||
twitch.botChat.say(cmd.to, chatQueue.join(' | '));
|
||||
} else {
|
||||
twitch.botChat.say(cmd.to, `No videos currently in queue!`);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
current: (cmd) => {
|
||||
// @TODO: Move retrieval of currentVideo into FGFM
|
||||
twitch.botChat.say(cmd.to, `Now Playing: ${director.state.currentVideo.chatName}`);
|
||||
},
|
||||
|
||||
|
||||
next: (cmd) => {
|
||||
// @TODO: Move retrieval of videoQueue into FGFM
|
||||
if (director.state.videoQueue.length > 0) {
|
||||
twitch.botChat.say(cmd.to, `Next Video: ${director.state.videoQueue[0].chatName}`);
|
||||
} else {
|
||||
twitch.botChat.say(cmd.to, `No videos currently in queue!`);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
vr: (cmd) => {
|
||||
let requestedVideoId = cmd.args[1] || false;
|
||||
if (requestedVideoId === false) {
|
||||
twitch.botChat.say(cmd.to, `Useage: ${config.twitch.cmdPrefix}vr <video-id> | Videos: https://pastebin.com/qv0wDkvB`);
|
||||
return;
|
||||
}
|
||||
|
||||
// make sure request vid isn't in the queue already
|
||||
// @TODO: Move check into FGFM
|
||||
if (director.state.videoQueue.findIndex(e => e.id === requestedVideoId) !== -1) {
|
||||
twitch.botChat.say(cmd.to, `That video is in the queue already!`);
|
||||
return;
|
||||
}
|
||||
|
||||
// search for req'd vid by id in config.vods.alttp
|
||||
let vodIndex = config.vods.alttp.findIndex(e => e.id === requestedVideoId);
|
||||
if (vodIndex === -1) {
|
||||
twitch.botChat.say(cmd.to, `A video with that ID does not exist!`);
|
||||
return;
|
||||
}
|
||||
|
||||
// @TODO: Make sure user hasn't met the request limit
|
||||
|
||||
config.vods.alttp[vodIndex].requestedBy = cmd.from;
|
||||
|
||||
// add to queue if it exists
|
||||
// @TODO: Return queue position from addVideo
|
||||
if (director.addVideo(config.vods.alttp[vodIndex])) {
|
||||
twitch.botChat.say(cmd.to, `${config.vods.alttp[vodIndex].chatName} has been added to the queue [${director.state.videoQueue.length}]`);
|
||||
} else {
|
||||
twitch.botChat.say(cmd.to, `${config.vods.alttp[vodIndex].chatName} could not be added to the queue!`);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
room: (cmd) => {
|
||||
let roomId = cmd.args[1] || false;
|
||||
let room;
|
||||
|
||||
if (roomId !== false) {
|
||||
let roomIndex = config.rooms.findIndex(e => e.id === parseInt(roomId));
|
||||
|
||||
if (roomIndex === -1) {
|
||||
twitch.botChat.say(cmd.to, `No room found matching that ID!`);
|
||||
return;
|
||||
}
|
||||
|
||||
room = config.rooms[roomIndex];
|
||||
} else {
|
||||
twitch.botChat.say(cmd.to, `Useage: ${config.twitch.cmdPrefix}room <room-id> | Rooms: https://goo.gl/qoNmuH`);
|
||||
return;
|
||||
}
|
||||
|
||||
// @TODO: Make sure user hasn't met the request limit
|
||||
|
||||
room.requestedBy = cmd.from;
|
||||
|
||||
director.addRoomVideo(room);
|
||||
// @TODO: Return new queue position from addRoomVideo and use below
|
||||
twitch.botChat.say(cmd.to, `Added ${room.dungeonName||'?'} - ${room.roomName||'?'} to the queue [${director.state.videoQueue.length}]!`);
|
||||
},
|
||||
|
||||
|
||||
rngames: (cmd) => {
|
||||
twitch.botChat.say(cmd.to, snesGames.sort(util.randSort).slice(0, 10).join(' | '));
|
||||
},
|
||||
|
||||
// voting to skip current video
|
||||
skip: (cmd) => {
|
||||
// check if there is an existing vote to skip for the director.state.currentVideo
|
||||
if (skipVote.target === director.state.currentVideo.id) {
|
||||
// if yes, add the vote, check if threshold is met, skip if necessary
|
||||
skipVote.count++;
|
||||
} else {
|
||||
skipVote.target = director.state.currentVideo.id;
|
||||
skipVote.count = 1;
|
||||
}
|
||||
|
||||
if (skipVote.count >= config.skipVoteThreshold) {
|
||||
director.skip();
|
||||
skipVote.target = null;
|
||||
}
|
||||
},
|
||||
|
||||
song: async (cmd) => {
|
||||
spotify.getCurrentSong()
|
||||
.then(async song => {
|
||||
let artists = [];
|
||||
await util.asyncForEach(song.artists, async (artist) => artists.push(artist.name));
|
||||
twitch.botChat.say(cmd.to, `Current Song: ${artists.join(',')} - ${song.name} | ${song.url}`);
|
||||
})
|
||||
.catch(err => twitch.botChat.say(cmd.to, `Error retrieving current song: ${JSON.stringify(err)}`));
|
||||
},
|
||||
|
||||
playlist: (cmd) => {
|
||||
spotify.getCurrentPlaylist()
|
||||
.then(playlist => twitch.botChat.say(cmd.to, `Current Playlist: ${playlist}`))
|
||||
.catch(err => twitch.botChat.say(cmd.to, `Error retrieving current playlist: ${JSON.stringify(err)}`));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Aliases for chat commands
|
||||
const aliases = {
|
||||
"rooms": "room"
|
||||
};
|
||||
|
||||
// Listen for the above commands
|
||||
twitch.botChat.addListener('message', (from, to, message) => {
|
||||
// Ignore everything from blacklisted users
|
||||
if (config.twitch.blacklistedUsers.includes(from)) return;
|
||||
|
||||
// Ignore commands that don't start with the designated prefix
|
||||
if (!message.startsWith(config.twitch.cmdPrefix)) return;
|
||||
|
||||
// Remove command prefix for parsing
|
||||
let noPrefix = message.slice(config.twitch.cmdPrefix.length);
|
||||
|
||||
// Ignore blank commands
|
||||
if (noPrefix.length === 0) return;
|
||||
|
||||
// Parse command arguments
|
||||
let args = noPrefix.split(' ');
|
||||
let key = args[0] || '';
|
||||
|
||||
// Ignore messages without a command
|
||||
if (!key || key.length === 0) return;
|
||||
|
||||
// Case-insensitive
|
||||
key.toLowerCase();
|
||||
|
||||
// Check for aliased commands
|
||||
if (aliases.hasOwnProperty(key)) key = aliases[key];
|
||||
|
||||
// Ignore unrecognized commands
|
||||
if (!commands.admin.hasOwnProperty(key) && !commands.user.hasOwnProperty(key)) return;
|
||||
|
||||
// Check if the command is on cooldown for this user in this channel (admins bypass this)
|
||||
let cooldownKey = md5(from+to+key);
|
||||
cooldowns.get(cooldownKey, config.twitch.defaultUserCooldown)
|
||||
.then(onCooldown => {
|
||||
if (onCooldown === false || config.twitch.admins.includes(from)) {
|
||||
let command = {message: message, from: from, to: to, key: key, args: args};
|
||||
|
||||
// Handle admin commands
|
||||
if (commands.admin.hasOwnProperty(command.key) && config.twitch.admins.includes(from)) {
|
||||
return commands.admin[command.key](command);
|
||||
}
|
||||
|
||||
// Handle all other user commands
|
||||
if (commands.user.hasOwnProperty(command.key)) {
|
||||
// Place this command on cooldown for the user
|
||||
cooldowns.set(cooldownKey, config.twitch.defaultUserCooldown);
|
||||
return commands.user[command.key](command);
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(console.error);
|
||||
});
|
||||
|
||||
const manageTimer = (timerName, timerStatus) => {
|
||||
// search timers for matching name
|
||||
let theTimerIndex = timersList.findIndex(e => e.name === timerName);
|
||||
if (theTimerIndex === -1) {
|
||||
throw("Invalid timer name!");
|
||||
}
|
||||
|
||||
let theTimer = timersList[theTimerIndex];
|
||||
|
||||
// look in activeTimers for current status
|
||||
let currentTimerIndex = activeTimers.findIndex(e => e.name === timerName);
|
||||
|
||||
if (!timerStatus || timerStatus !== 'on' || timerStatus !== 'off') {
|
||||
// toggle by default
|
||||
if (currentTimerIndex === -1) {
|
||||
timerStatus = 'on';
|
||||
} else {
|
||||
timerStatus = 'off';
|
||||
}
|
||||
}
|
||||
|
||||
if (currentTimerIndex === -1 && timerStatus === 'on') {
|
||||
let timerFunc = () => {
|
||||
twitch.botChat.say(config.twitch.channel, theTimer.value);
|
||||
};
|
||||
let timerInterval = setInterval(timerFunc, theTimer.interval*1000);
|
||||
activeTimers.push({name: theTimer.name, timer: timerInterval});
|
||||
timerFunc();
|
||||
} else if (timerStatus === 'off') {
|
||||
clearInterval(activeTimers[currentTimerIndex].timer);
|
||||
activeTimers.splice(currentTimerIndex, 1);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// @TODO: Modularize timed events
|
||||
//console.log(`Initializing stream timers...`);
|
||||
let userVotes = currentChoices = [];
|
||||
let rockTheVote = () => {};
|
||||
// @TODO: Move this interval to config
|
||||
let rtvInterval = setInterval(() => {rockTheVote()}, 300000);
|
||||
let videoVoteJob = new schedule.Job(async () => {
|
||||
// Tally votes from previous election (if there was one), add the winner to the queue
|
||||
let winner;
|
||||
if (currentChoices.length > 0) {
|
||||
if (userVotes.length === 0) {
|
||||
// choose a random element from currentChoices
|
||||
winner = util.randElement(currentChoices);
|
||||
console.log(`VIDEO CHOSEN RANDOMLY: ${winner.chatName}`);
|
||||
twitch.botChat.say(config.twitch.channel, `No Votes Logged -- Next Video Chosen at Random: ${winner.chatName}`);
|
||||
} else {
|
||||
// tally and sort votes
|
||||
let voteTallies = [];
|
||||
await util.asyncForEach(userVotes, async (vote) => {
|
||||
tallyIndex = voteTallies.findIndex(e => e.id === vote.vote);
|
||||
if (tallyIndex !== -1) {
|
||||
voteTallies[tallyIndex].count++;
|
||||
} else {
|
||||
voteTallies.push({id: vote.vote, count: 1});
|
||||
}
|
||||
});
|
||||
voteTallies.sort((a, b) => {
|
||||
if (a.count < b.count) {
|
||||
return -1;
|
||||
}
|
||||
if (a.count > b.count) {
|
||||
return 1;
|
||||
}
|
||||
// a must be equal to b
|
||||
return 0;
|
||||
});
|
||||
|
||||
console.log(`Voting Results: ${JSON.stringify(voteTallies)}`);
|
||||
winner = currentChoices[voteTallies[0].id-1];
|
||||
console.log(`WINNER OF THE VOTE: ${winner.chatName}`);
|
||||
twitch.botChat.say(config.twitch.channel, `Winner of the Video Vote: ${winner.chatName}`);
|
||||
|
||||
// clear user votes
|
||||
userVotes = [];
|
||||
}
|
||||
|
||||
director.addVideo(winner);
|
||||
}
|
||||
|
||||
// choose more random videos from config.vods.alttp (that aren't already in the queue)
|
||||
// @TODO: Move into FGFM
|
||||
let vodsNotInQueue = config.vods.alttp.filter(e => {
|
||||
let inQueue = (director.state.videoQueue.findIndex(q => q.id === e.id) !== -1) && (director.state.currentVideo.id !== e.id);
|
||||
return !inQueue;
|
||||
});
|
||||
currentChoices = vodsNotInQueue.sort(util.randSort).slice(0, config.videoPollSize);
|
||||
|
||||
// Poll the chat
|
||||
let chatChoices = currentChoices.map((c, i) => {
|
||||
return `[${i+1}] ${c.chatName}`;
|
||||
});
|
||||
|
||||
rockTheVote = () => {
|
||||
twitch.botChat.say(config.twitch.channel, `Vote for which video you'd like to add to the queue using ${config.twitch.cmdPrefix}vote #: ${chatChoices.join(' | ')}`)
|
||||
};
|
||||
clearInterval(rtvInterval);
|
||||
rockTheVote();
|
||||
rtvInterval = setInterval(() => {rockTheVote()}, 300000);
|
||||
});
|
||||
};
|
||||
|
||||
// catches Promise errors
|
||||
process.on('unhandledRejection', console.error);
|
||||
283
package-lock.json
generated
283
package-lock.json
generated
@@ -9,10 +9,10 @@
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
|
||||
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
|
||||
"requires": {
|
||||
"co": "4.6.0",
|
||||
"fast-deep-equal": "1.1.0",
|
||||
"fast-json-stable-stringify": "2.0.0",
|
||||
"json-schema-traverse": "0.3.1"
|
||||
"co": "^4.6.0",
|
||||
"fast-deep-equal": "^1.0.0",
|
||||
"fast-json-stable-stringify": "^2.0.0",
|
||||
"json-schema-traverse": "^0.3.0"
|
||||
}
|
||||
},
|
||||
"asn1": {
|
||||
@@ -20,7 +20,7 @@
|
||||
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
|
||||
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
|
||||
"requires": {
|
||||
"safer-buffer": "2.1.2"
|
||||
"safer-buffer": "~2.1.0"
|
||||
}
|
||||
},
|
||||
"assert-plus": {
|
||||
@@ -33,7 +33,7 @@
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
|
||||
"integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
|
||||
"requires": {
|
||||
"lodash": "4.17.11"
|
||||
"lodash": "^4.17.10"
|
||||
}
|
||||
},
|
||||
"async-limiter": {
|
||||
@@ -56,14 +56,22 @@
|
||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
|
||||
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.19.2",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
|
||||
"integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
|
||||
"requires": {
|
||||
"follow-redirects": "1.5.10"
|
||||
}
|
||||
},
|
||||
"babel-polyfill": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
|
||||
"integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
|
||||
"requires": {
|
||||
"babel-runtime": "6.26.0",
|
||||
"core-js": "2.5.7",
|
||||
"regenerator-runtime": "0.10.5"
|
||||
"babel-runtime": "^6.26.0",
|
||||
"core-js": "^2.5.0",
|
||||
"regenerator-runtime": "^0.10.5"
|
||||
}
|
||||
},
|
||||
"babel-runtime": {
|
||||
@@ -71,8 +79,8 @@
|
||||
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
|
||||
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
|
||||
"requires": {
|
||||
"core-js": "2.5.7",
|
||||
"regenerator-runtime": "0.11.1"
|
||||
"core-js": "^2.4.0",
|
||||
"regenerator-runtime": "^0.11.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"regenerator-runtime": {
|
||||
@@ -88,7 +96,7 @@
|
||||
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"tweetnacl": "0.14.5"
|
||||
"tweetnacl": "^0.14.3"
|
||||
}
|
||||
},
|
||||
"bindings": {
|
||||
@@ -121,7 +129,7 @@
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
|
||||
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
|
||||
"requires": {
|
||||
"delayed-stream": "1.0.0"
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"commander": {
|
||||
@@ -154,8 +162,8 @@
|
||||
"resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.6.0.tgz",
|
||||
"integrity": "sha512-KGfDDTjBIx85MnVYcdhLccoJH/7jcYW+5Z/t3Wsg2QlJhmmjf+97z+9sQftS71lopOYYapjEKEvmWaCsym5Z4g==",
|
||||
"requires": {
|
||||
"is-nan": "1.2.1",
|
||||
"moment-timezone": "0.5.21"
|
||||
"is-nan": "^1.2.1",
|
||||
"moment-timezone": "^0.5.0"
|
||||
}
|
||||
},
|
||||
"crypt": {
|
||||
@@ -168,13 +176,14 @@
|
||||
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
||||
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0"
|
||||
"assert-plus": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
@@ -184,7 +193,7 @@
|
||||
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
|
||||
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
|
||||
"requires": {
|
||||
"object-keys": "1.0.12"
|
||||
"object-keys": "^1.0.12"
|
||||
}
|
||||
},
|
||||
"delayed-stream": {
|
||||
@@ -197,11 +206,11 @@
|
||||
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.4.2.tgz",
|
||||
"integrity": "sha512-MDwpu0lMFTjqomijDl1Ed9miMQe6kB4ifKdP28QZllmLv/HVOJXhatRgjS8urp/wBlOfx+qAYSXcdI5cKGYsfg==",
|
||||
"requires": {
|
||||
"long": "4.0.0",
|
||||
"prism-media": "0.0.3",
|
||||
"snekfetch": "3.6.4",
|
||||
"tweetnacl": "1.0.0",
|
||||
"ws": "4.1.0"
|
||||
"long": "^4.0.0",
|
||||
"prism-media": "^0.0.3",
|
||||
"snekfetch": "^3.6.4",
|
||||
"tweetnacl": "^1.0.0",
|
||||
"ws": "^4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"tweetnacl": {
|
||||
@@ -217,8 +226,8 @@
|
||||
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"jsbn": "0.1.1",
|
||||
"safer-buffer": "2.1.2"
|
||||
"jsbn": "~0.1.0",
|
||||
"safer-buffer": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"extend": {
|
||||
@@ -251,8 +260,26 @@
|
||||
"resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz",
|
||||
"integrity": "sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=",
|
||||
"requires": {
|
||||
"async": "2.6.1",
|
||||
"which": "1.3.1"
|
||||
"async": ">=0.2.9",
|
||||
"which": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
|
||||
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
|
||||
"requires": {
|
||||
"debug": "=3.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"forever-agent": {
|
||||
@@ -265,9 +292,9 @@
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
|
||||
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
|
||||
"requires": {
|
||||
"asynckit": "0.4.0",
|
||||
"combined-stream": "1.0.7",
|
||||
"mime-types": "2.1.21"
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.6",
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"formidable": {
|
||||
@@ -280,7 +307,7 @@
|
||||
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
||||
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0"
|
||||
"assert-plus": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"har-schema": {
|
||||
@@ -293,8 +320,8 @@
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
|
||||
"integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
|
||||
"requires": {
|
||||
"ajv": "5.5.2",
|
||||
"har-schema": "2.0.0"
|
||||
"ajv": "^5.3.0",
|
||||
"har-schema": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"http-signature": {
|
||||
@@ -302,9 +329,9 @@
|
||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
||||
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"jsprim": "1.4.1",
|
||||
"sshpk": "1.14.2"
|
||||
"assert-plus": "^1.0.0",
|
||||
"jsprim": "^1.2.2",
|
||||
"sshpk": "^1.7.0"
|
||||
}
|
||||
},
|
||||
"iconv": {
|
||||
@@ -313,7 +340,7 @@
|
||||
"integrity": "sha1-4ITWDut9c9p/CpwJbkyKvgkL+u0=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"nan": "2.10.0"
|
||||
"nan": "^2.3.5"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
@@ -326,9 +353,9 @@
|
||||
"resolved": "https://registry.npmjs.org/irc/-/irc-0.5.2.tgz",
|
||||
"integrity": "sha1-NxT0doNlqW0LL3dryRFmvrJGS7w=",
|
||||
"requires": {
|
||||
"iconv": "2.2.3",
|
||||
"irc-colors": "1.4.3",
|
||||
"node-icu-charset-detector": "0.2.0"
|
||||
"iconv": "~2.2.1",
|
||||
"irc-colors": "^1.1.0",
|
||||
"node-icu-charset-detector": "~0.2.0"
|
||||
}
|
||||
},
|
||||
"irc-colors": {
|
||||
@@ -346,7 +373,7 @@
|
||||
"resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz",
|
||||
"integrity": "sha1-n69ltvttskt/XAYoR16nH5iEAeI=",
|
||||
"requires": {
|
||||
"define-properties": "1.1.3"
|
||||
"define-properties": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"is-typedarray": {
|
||||
@@ -421,9 +448,9 @@
|
||||
"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
|
||||
"integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
|
||||
"requires": {
|
||||
"charenc": "0.0.2",
|
||||
"crypt": "0.0.2",
|
||||
"is-buffer": "1.1.6"
|
||||
"charenc": "~0.0.1",
|
||||
"crypt": "~0.0.1",
|
||||
"is-buffer": "~1.1.1"
|
||||
}
|
||||
},
|
||||
"memcache": {
|
||||
@@ -451,7 +478,7 @@
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
|
||||
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
|
||||
"requires": {
|
||||
"mime-db": "1.37.0"
|
||||
"mime-db": "~1.37.0"
|
||||
}
|
||||
},
|
||||
"moment": {
|
||||
@@ -464,7 +491,7 @@
|
||||
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.21.tgz",
|
||||
"integrity": "sha512-j96bAh4otsgj3lKydm3K7kdtA3iKf2m6MY2iSYCzCm5a1zmHo1g+aK3068dDEeocLZQIS9kU8bsdQHLqEvgW0A==",
|
||||
"requires": {
|
||||
"moment": "2.22.2"
|
||||
"moment": ">= 2.9.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
@@ -482,8 +509,8 @@
|
||||
"resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.0.tgz",
|
||||
"integrity": "sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw==",
|
||||
"requires": {
|
||||
"clone": "2.1.2",
|
||||
"lodash": "4.17.11"
|
||||
"clone": "2.x",
|
||||
"lodash": "4.x"
|
||||
}
|
||||
},
|
||||
"node-icu-charset-detector": {
|
||||
@@ -492,7 +519,7 @@
|
||||
"integrity": "sha1-wjINo3Tdy2cfxUy0oOBB4Vb/1jk=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"nan": "2.10.0"
|
||||
"nan": "^2.3.3"
|
||||
}
|
||||
},
|
||||
"node-opus": {
|
||||
@@ -500,10 +527,10 @@
|
||||
"resolved": "https://registry.npmjs.org/node-opus/-/node-opus-0.2.9.tgz",
|
||||
"integrity": "sha512-+IIOdav5D7vHsuLDNk55t17kK2s6c1w4DbfKw8UQxZ635n+AO/SqDE3RpuO3PZKqpWjPtL/chzYZNVxz8/4TUQ==",
|
||||
"requires": {
|
||||
"bindings": "1.2.1",
|
||||
"commander": "2.11.0",
|
||||
"nan": "2.10.0",
|
||||
"ogg-packet": "1.0.0"
|
||||
"bindings": "~1.2.1",
|
||||
"commander": "^2.9.0",
|
||||
"nan": "^2.10.0",
|
||||
"ogg-packet": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node-schedule": {
|
||||
@@ -511,9 +538,9 @@
|
||||
"resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.0.tgz",
|
||||
"integrity": "sha512-NNwO9SUPjBwFmPh3vXiPVEhJLn4uqYmZYvJV358SRGM06BR4UoIqxJpeJwDDXB6atULsgQA97MfD1zMd5xsu+A==",
|
||||
"requires": {
|
||||
"cron-parser": "2.6.0",
|
||||
"cron-parser": "^2.4.0",
|
||||
"long-timeout": "0.1.1",
|
||||
"sorted-array-functions": "1.2.0"
|
||||
"sorted-array-functions": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"oauth-sign": {
|
||||
@@ -531,10 +558,10 @@
|
||||
"resolved": "https://registry.npmjs.org/obs-websocket-js/-/obs-websocket-js-1.2.0.tgz",
|
||||
"integrity": "sha1-aE/Br0r+JlV4wXd2dqW7LKKrwGw=",
|
||||
"requires": {
|
||||
"babel-polyfill": "6.26.0",
|
||||
"debug": "3.1.0",
|
||||
"sha.js": "2.4.11",
|
||||
"ws": "5.2.2"
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"debug": "^3.1.0",
|
||||
"sha.js": "^2.4.9",
|
||||
"ws": "^5.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
@@ -550,7 +577,7 @@
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
|
||||
"integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
|
||||
"requires": {
|
||||
"async-limiter": "1.0.0"
|
||||
"async-limiter": "~1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -561,7 +588,7 @@
|
||||
"integrity": "sha1-RbiFchrI991c8iOR1CEGrlM6xng=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ref-struct": "1.1.0"
|
||||
"ref-struct": "*"
|
||||
}
|
||||
},
|
||||
"performance-now": {
|
||||
@@ -599,13 +626,13 @@
|
||||
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||
"requires": {
|
||||
"core-util-is": "1.0.2",
|
||||
"inherits": "2.0.3",
|
||||
"isarray": "1.0.0",
|
||||
"process-nextick-args": "2.0.0",
|
||||
"safe-buffer": "5.1.2",
|
||||
"string_decoder": "1.1.1",
|
||||
"util-deprecate": "1.0.2"
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
}
|
||||
},
|
||||
"ref": {
|
||||
@@ -614,9 +641,9 @@
|
||||
"integrity": "sha512-2cBCniTtxcGUjDpvFfVpw323a83/0RLSGJJY5l5lcomZWhYpU2cuLdsvYqMixvsdLJ9+sTdzEkju8J8ZHDM2nA==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"bindings": "1.2.1",
|
||||
"debug": "2.6.9",
|
||||
"nan": "2.10.0"
|
||||
"bindings": "1",
|
||||
"debug": "2",
|
||||
"nan": "2"
|
||||
}
|
||||
},
|
||||
"ref-struct": {
|
||||
@@ -625,8 +652,8 @@
|
||||
"integrity": "sha1-XV7mWtQc78Olxf60BYcmHkee3BM=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"ref": "1.3.5"
|
||||
"debug": "2",
|
||||
"ref": "1"
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
@@ -639,26 +666,26 @@
|
||||
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
|
||||
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
|
||||
"requires": {
|
||||
"aws-sign2": "0.7.0",
|
||||
"aws4": "1.8.0",
|
||||
"caseless": "0.12.0",
|
||||
"combined-stream": "1.0.6",
|
||||
"extend": "3.0.2",
|
||||
"forever-agent": "0.6.1",
|
||||
"form-data": "2.3.2",
|
||||
"har-validator": "5.1.0",
|
||||
"http-signature": "1.2.0",
|
||||
"is-typedarray": "1.0.0",
|
||||
"isstream": "0.1.2",
|
||||
"json-stringify-safe": "5.0.1",
|
||||
"mime-types": "2.1.19",
|
||||
"oauth-sign": "0.9.0",
|
||||
"performance-now": "2.1.0",
|
||||
"qs": "6.5.2",
|
||||
"safe-buffer": "5.1.2",
|
||||
"tough-cookie": "2.4.3",
|
||||
"tunnel-agent": "0.6.0",
|
||||
"uuid": "3.3.2"
|
||||
"aws-sign2": "~0.7.0",
|
||||
"aws4": "^1.8.0",
|
||||
"caseless": "~0.12.0",
|
||||
"combined-stream": "~1.0.6",
|
||||
"extend": "~3.0.2",
|
||||
"forever-agent": "~0.6.1",
|
||||
"form-data": "~2.3.2",
|
||||
"har-validator": "~5.1.0",
|
||||
"http-signature": "~1.2.0",
|
||||
"is-typedarray": "~1.0.0",
|
||||
"isstream": "~0.1.2",
|
||||
"json-stringify-safe": "~5.0.1",
|
||||
"mime-types": "~2.1.19",
|
||||
"oauth-sign": "~0.9.0",
|
||||
"performance-now": "^2.1.0",
|
||||
"qs": "~6.5.2",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"tough-cookie": "~2.4.3",
|
||||
"tunnel-agent": "^0.6.0",
|
||||
"uuid": "^3.3.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"combined-stream": {
|
||||
@@ -666,7 +693,7 @@
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
|
||||
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
|
||||
"requires": {
|
||||
"delayed-stream": "1.0.0"
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"extend": {
|
||||
@@ -679,9 +706,9 @@
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
|
||||
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
|
||||
"requires": {
|
||||
"asynckit": "0.4.0",
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "1.0.6",
|
||||
"mime-types": "2.1.19"
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"mime-db": {
|
||||
@@ -694,7 +721,7 @@
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",
|
||||
"integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==",
|
||||
"requires": {
|
||||
"mime-db": "1.35.0"
|
||||
"mime-db": "~1.35.0"
|
||||
}
|
||||
},
|
||||
"qs": {
|
||||
@@ -719,8 +746,8 @@
|
||||
"resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
|
||||
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
|
||||
"requires": {
|
||||
"inherits": "2.0.3",
|
||||
"safe-buffer": "5.1.2"
|
||||
"inherits": "^2.0.1",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"snekfetch": {
|
||||
@@ -738,7 +765,7 @@
|
||||
"resolved": "https://registry.npmjs.org/spotify-web-api-node/-/spotify-web-api-node-4.0.0.tgz",
|
||||
"integrity": "sha512-FQAX4qiP9xfjmJpkSfF5PEVr7RVorUZiLvcdVTlhVFLYAmQ8VSsZlyb0yTK0GExKhAcgJy9GfWxqjSB2r9SrjA==",
|
||||
"requires": {
|
||||
"superagent": "3.8.3"
|
||||
"superagent": "^3.7.0"
|
||||
}
|
||||
},
|
||||
"sshpk": {
|
||||
@@ -746,15 +773,15 @@
|
||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
|
||||
"integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
|
||||
"requires": {
|
||||
"asn1": "0.2.4",
|
||||
"assert-plus": "1.0.0",
|
||||
"bcrypt-pbkdf": "1.0.2",
|
||||
"dashdash": "1.14.1",
|
||||
"ecc-jsbn": "0.1.2",
|
||||
"getpass": "0.1.7",
|
||||
"jsbn": "0.1.1",
|
||||
"safer-buffer": "2.1.2",
|
||||
"tweetnacl": "0.14.5"
|
||||
"asn1": "~0.2.3",
|
||||
"assert-plus": "^1.0.0",
|
||||
"bcrypt-pbkdf": "^1.0.0",
|
||||
"dashdash": "^1.12.0",
|
||||
"ecc-jsbn": "~0.1.1",
|
||||
"getpass": "^0.1.1",
|
||||
"jsbn": "~0.1.0",
|
||||
"safer-buffer": "^2.0.2",
|
||||
"tweetnacl": "~0.14.0"
|
||||
}
|
||||
},
|
||||
"string_decoder": {
|
||||
@@ -762,7 +789,7 @@
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"requires": {
|
||||
"safe-buffer": "5.1.2"
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"superagent": {
|
||||
@@ -770,16 +797,16 @@
|
||||
"resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz",
|
||||
"integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==",
|
||||
"requires": {
|
||||
"component-emitter": "1.2.1",
|
||||
"cookiejar": "2.1.2",
|
||||
"debug": "3.2.6",
|
||||
"extend": "3.0.2",
|
||||
"form-data": "2.3.3",
|
||||
"formidable": "1.2.1",
|
||||
"methods": "1.1.2",
|
||||
"mime": "1.6.0",
|
||||
"qs": "6.5.2",
|
||||
"readable-stream": "2.3.6"
|
||||
"component-emitter": "^1.2.0",
|
||||
"cookiejar": "^2.1.0",
|
||||
"debug": "^3.1.0",
|
||||
"extend": "^3.0.0",
|
||||
"form-data": "^2.3.1",
|
||||
"formidable": "^1.2.0",
|
||||
"methods": "^1.1.1",
|
||||
"mime": "^1.4.1",
|
||||
"qs": "^6.5.1",
|
||||
"readable-stream": "^2.3.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
@@ -787,7 +814,7 @@
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||
"requires": {
|
||||
"ms": "2.1.1"
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
@@ -802,8 +829,8 @@
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
|
||||
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
|
||||
"requires": {
|
||||
"psl": "1.1.29",
|
||||
"punycode": "1.4.1"
|
||||
"psl": "^1.1.24",
|
||||
"punycode": "^1.4.1"
|
||||
}
|
||||
},
|
||||
"tunnel-agent": {
|
||||
@@ -811,7 +838,7 @@
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
|
||||
"requires": {
|
||||
"safe-buffer": "5.1.2"
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"tweetnacl": {
|
||||
@@ -835,9 +862,9 @@
|
||||
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
||||
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"assert-plus": "^1.0.0",
|
||||
"core-util-is": "1.0.2",
|
||||
"extsprintf": "1.3.0"
|
||||
"extsprintf": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"which": {
|
||||
@@ -845,7 +872,7 @@
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
|
||||
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
|
||||
"requires": {
|
||||
"isexe": "2.0.0"
|
||||
"isexe": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"ws": {
|
||||
@@ -853,8 +880,8 @@
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz",
|
||||
"integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==",
|
||||
"requires": {
|
||||
"async-limiter": "1.0.0",
|
||||
"safe-buffer": "5.1.2"
|
||||
"async-limiter": "~1.0.0",
|
||||
"safe-buffer": "~5.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"safe-buffer": {
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"main": "main.js",
|
||||
"dependencies": {
|
||||
"async": "^2.6.1",
|
||||
"axios": "^0.19.2",
|
||||
"discord.js": "^11.4.2",
|
||||
"ffmpeg-binaries": "^3.2.2",
|
||||
"fluent-ffmpeg": "^2.1.2",
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
const rooms = require('./conf/rooms.json');
|
||||
const util = require('./lib/util');
|
||||
const fs = require('fs');
|
||||
|
||||
populateDatabase();
|
||||
|
||||
async function populateDatabase() {
|
||||
let database = "'ID','Dungeon','Room'\r\n";
|
||||
await util.asyncForEach(rooms, async (room, index) => {
|
||||
let entry = `'${room.id}','${room.dungeonName||'?'}','${room.roomName||'?'}'\r\n`;
|
||||
database += entry;
|
||||
console.log('added entry', entry);
|
||||
});
|
||||
|
||||
fs.writeFile('rooms-list.csv', database, 'utf8', () => {console.log('done')});
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const util = require('./lib/util');
|
||||
const ffmpeg = require('fluent-ffmpeg');
|
||||
|
||||
let roomVidPath = `/var/hypnoadmin/media/videos/ALttP/my-vids/room-vids`;
|
||||
|
||||
const getAllFiles = dir =>
|
||||
fs.readdirSync(dir).reduce((files, file) => {
|
||||
const name = path.join(dir, file);
|
||||
const isDirectory = fs.statSync(name).isDirectory();
|
||||
return isDirectory ? [...files, ...getAllFiles(name)] : [...files, name];
|
||||
}, []);
|
||||
|
||||
let roomVidFiles = getAllFiles(roomVidPath);
|
||||
|
||||
populateDatabase();
|
||||
|
||||
async function populateDatabase() {
|
||||
let database = [];
|
||||
await util.asyncForEach(roomVidFiles, async (file, index) => {
|
||||
// ignore anything that's not an mp4
|
||||
let shortPath = file.replace(roomVidPath, '');
|
||||
if (!/\.mp4$/.test(shortPath)) {
|
||||
return;
|
||||
}
|
||||
|
||||
let entry = {
|
||||
id: index+1,
|
||||
shortPath: shortPath,
|
||||
winPath: shortPath.replace(/\//g, '\\')
|
||||
};
|
||||
|
||||
// chop up the short path and extract metadata
|
||||
let matches = shortPath.match(/^\/([0-9]{2})-([a-z]+)\/([0-9]{2})-(.+)\.mp4/);
|
||||
if (matches) {
|
||||
entry.dungeonId = matches[1];
|
||||
entry.dungeonName = matches[2];
|
||||
entry.roomId = matches[3];
|
||||
entry.roomName = matches[4];
|
||||
}
|
||||
|
||||
// @TODO support some other paths / structures
|
||||
|
||||
entry.videoData = await getVideoMetadata(file);
|
||||
database.push(entry);
|
||||
console.log('added entry', entry);
|
||||
});
|
||||
|
||||
fs.writeFile('conf/rooms.json', JSON.stringify(database), 'utf8', () => {console.log('done')});
|
||||
}
|
||||
|
||||
function getVideoMetadata(videoPath) {
|
||||
return new Promise((resolve, reject) => {
|
||||
ffmpeg.ffprobe(videoPath, (err, metadata) => {
|
||||
// find the video stream
|
||||
let stream = metadata.streams.find(e => e.codec_type === "video");
|
||||
if (!stream) {
|
||||
resolve(false);
|
||||
}
|
||||
|
||||
resolve({
|
||||
width: stream.width,
|
||||
height: stream.height,
|
||||
fps: parseInt(stream.r_frame_rate.replace('/1', '')),
|
||||
length: stream.duration
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
818
rooms-list.csv
818
rooms-list.csv
@@ -1,818 +0,0 @@
|
||||
"ID","Dungeon","Room"
|
||||
"0","escape","links-house-2911"
|
||||
"1","escape","outside-links-house-723"
|
||||
"2","escape","outside-castle-1628"
|
||||
"3","escape","outside-castle-1631"
|
||||
"4","escape","uncle-1342"
|
||||
"5","escape","uncle-1348"
|
||||
"6","escape","passage-exit-442"
|
||||
"7","escape","courtyard-923"
|
||||
"8","escape","castle-lobby-631"
|
||||
"9","escape","castle-lobby-pumpless-636"
|
||||
"10","escape","sw-room-439"
|
||||
"11","escape","sw-room-pumpless-448"
|
||||
"12","escape","west-guard-hallway1-603"
|
||||
"13","escape","statue-hallway1-415"
|
||||
"14","escape","1st-keyguard-leftslash-801"
|
||||
"15","escape","first-keyguard1-3slash-825"
|
||||
"16","escape","first-keyguard1-upspin-811"
|
||||
"17","escape","b1-pit-lower-404"
|
||||
"18","escape","b1-pit2-lower-945"
|
||||
"19","escape","stealth-room-927"
|
||||
"20","escape","stealth-room-929"
|
||||
"21","escape","green-guard-bestrng-432"
|
||||
"22","escape","green-guard-bestrng-rta-438"
|
||||
"23","escape","blue-boomguard-739"
|
||||
"24","escape","blue-boomguard-skip-627"
|
||||
"25","escape","green-guard2-426"
|
||||
"26","escape","stairs-to-b2-1-359"
|
||||
"27","escape","b2-1-533"
|
||||
"28","escape","bnc-1pot4slash-3227"
|
||||
"29","escape","bnc-8slash-3120"
|
||||
"30","escape","bnc-8slash-3130"
|
||||
"31","escape","bnc-joestrat-3238"
|
||||
"32","escape","bnc-joestrat-3244"
|
||||
"33","escape","b2-2-530"
|
||||
"34","escape","stairs-to-b2-2-651"
|
||||
"35","escape","stairs-to-b2-2-652"
|
||||
"36","escape","green-guard3-426"
|
||||
"37","escape","stealth-room2-920"
|
||||
"38","escape","b1-pit2-upper-301"
|
||||
"39","escape","b1-pit1-upper-627"
|
||||
"40","escape","b1-pit1-upper-pumpless-628"
|
||||
"41","escape","1st-keyguard2-314"
|
||||
"42","escape","statue-hallway2-709"
|
||||
"43","escape","west-guard-hallway2-612"
|
||||
"44","escape","sw-room2-445"
|
||||
"45","escape","castle-lobby2-721"
|
||||
"46","escape","throne-room-1632"
|
||||
"47","escape","throne-room-1634"
|
||||
"48","escape","sewer-passage-857"
|
||||
"49","escape","sewer-passage-pumpless-903"
|
||||
"50","escape","snake-room-700"
|
||||
"51","escape","snake-room-perfect-rng-655"
|
||||
"52","escape","sewer-key-chest-risky-1212"
|
||||
"53","escape","sewer-key-chest-rta-1215"
|
||||
"54","escape","sewer1-706"
|
||||
"55","escape","sewer1-707"
|
||||
"56","escape","sewer2-608"
|
||||
"57","escape","keyrat-840"
|
||||
"58","escape","rat-hallway-827"
|
||||
"59","escape","behind-sanc-705"
|
||||
"60","escape","behind-sanc-rta-719"
|
||||
"61","escape","behind-sanc2-720"
|
||||
"62","?","?"
|
||||
"63","eastern","sanc-2946"
|
||||
"64","eastern","sanc-heart-3303"
|
||||
"65","eastern","sanc-heart-chestturn-3305"
|
||||
"66","eastern","outside-sanc-807"
|
||||
"67","eastern","graveyard-646"
|
||||
"68","eastern","east-path-403"
|
||||
"69","eastern","wooden-bridge-906"
|
||||
"70","eastern","octofield-724"
|
||||
"71","eastern","guard-bridge-311"
|
||||
"72","eastern","east-fairy-cave-right-exit-326"
|
||||
"73","eastern","outside-eastern-2540"
|
||||
"74","eastern","entrance-504"
|
||||
"75","eastern","three-popos-434"
|
||||
"76","eastern","cannonballs-859"
|
||||
"77","eastern","bigchest-upper-leftpot-736"
|
||||
"78","eastern","westwing-upper-455"
|
||||
"79","eastern","stalfos-spawn-617"
|
||||
"80","eastern","compass-room-615"
|
||||
"81","eastern","westwing-lower1-335"
|
||||
"82","eastern","bigchest-lower1-arrows-805"
|
||||
"83","eastern","bigchest-lower1-noarrows-704"
|
||||
"84","eastern","east-wing-645"
|
||||
"85","eastern","dark-af-boom-623"
|
||||
"86","eastern","dark-af-sword-630"
|
||||
"87","eastern","dark-potkey-diagboom-656"
|
||||
"88","eastern","dark-potkey-walk-658"
|
||||
"89","eastern","dark-af2-607"
|
||||
"90","eastern","cannonballs-upper-851"
|
||||
"91","eastern","bigkey-1105"
|
||||
"92","eastern","westwing-lower2-756"
|
||||
"93","eastern","bigchest-bow-1452"
|
||||
"94","eastern","gwg-noslash-menu-913"
|
||||
"95","eastern","afpots-802"
|
||||
"96","eastern","eyegore-floor-switch-519"
|
||||
"97","eastern","eyegore-floor-switch-pumpless-522"
|
||||
"98","eastern","cannonball-switch-503"
|
||||
"99","eastern","cannonball-switch-pumpless-507"
|
||||
"100","eastern","zgr-601"
|
||||
"101","eastern","double-red-eyegores-617"
|
||||
"102","eastern","armos-topright-1321"
|
||||
"103","desert","outside-eastern-1322"
|
||||
"104","desert","saha-walkout-1951-449-8"
|
||||
"105","desert","outside-eastern2-1301-99-0"
|
||||
"106","desert","east-fairy-cave-253"
|
||||
"107","desert","guard-bridge-601-35-0"
|
||||
"108","desert","links-yard-354-32-0"
|
||||
"109","desert","annoying-bushes-403"
|
||||
"110","desert","west-of-swamp1-356"
|
||||
"111","desert","south-of-grove1-right-exit-452-32-0"
|
||||
"112","desert","grove-westside1-nocharge-255"
|
||||
"113","desert","grove-westside1-swordcharge-308"
|
||||
"114","desert","outside-library1-dashes-708"
|
||||
"115","desert","outside-library1-spindash-626"
|
||||
"116","desert","library-1038-127-0"
|
||||
"117","desert","outside-library2-noss-751-99-0"
|
||||
"118","desert","outside-library2-spindash-707"
|
||||
"119","desert","grove-westside2-leftexit-233-36"
|
||||
"120","desert","grove-westside2-rta-243-36"
|
||||
"121","desert","south-of-grove2-fromleft-belowbush-458-32"
|
||||
"122","desert","south-of-grove2-fromleft-bushdash-455-32"
|
||||
"123","desert","south-of-grove2-fromright-bushdash-447-32"
|
||||
"124","desert","west-of-swamp2-frombelow-350"
|
||||
"125","desert","west-of-swamp2-frombushes-346"
|
||||
"126","desert","west-of-swamp2-fromlowbushes-346"
|
||||
"127","desert","west-of-swamp2-fromlowbushes-farleftexit-346"
|
||||
"128","desert","annoying-bushes2-352-33"
|
||||
"129","desert","links-yard-339-32"
|
||||
"130","desert","links-yard-earlydash-336-32"
|
||||
"131","desert","waterdash-menu-629-35-1"
|
||||
"132","desert","waterdash-nomenu-524-37-0"
|
||||
"133","desert","east-of-watergate-216-35"
|
||||
"134","desert","watergate-552-37"
|
||||
"135","desert","middle-aged-man-643-31"
|
||||
"136","desert","outside-desert-2250-175"
|
||||
"137","desert","desert1-risky-726-97"
|
||||
"138","desert","desert1-rta-730-98"
|
||||
"139","desert","north-hall1-leftpoke-510-21"
|
||||
"140","desert","north-hall1-rtapoke-512-21"
|
||||
"141","desert","nw-room1-258-19"
|
||||
"142","desert","torchkey-rta-614"
|
||||
"143","desert","torchkey-underleft-614"
|
||||
"144","desert","nw-room2-235"
|
||||
"145","desert","north-hall2-412-21"
|
||||
"146","desert","ne-room1-351"
|
||||
"147","desert","east-wing1-416-21"
|
||||
"148","desert","compass-room1-519"
|
||||
"149","desert","bigkey-chestturn-758-49"
|
||||
"150","desert","bigkey-rta-goodrng-803"
|
||||
"151","desert","compass-room2-405"
|
||||
"152","desert","compass-room2-pumpless-407"
|
||||
"153","desert","east-wing2-318"
|
||||
"154","desert","east-wing2-pumpless-319"
|
||||
"155","desert","ne-room2-418-20"
|
||||
"156","desert","north-hall3-412-21"
|
||||
"157","desert","nw-room3-346-18"
|
||||
"158","desert","cop1-528"
|
||||
"159","desert","bigchest-606-29-1"
|
||||
"160","desert","cop2-355"
|
||||
"161","desert","nw-room4-dashes-348"
|
||||
"162","desert","nw-room4-walk-rta-349"
|
||||
"163","desert","west-wing-451-21"
|
||||
"164","desert","d1-exit-324"
|
||||
"165","desert","outside-desert-noss-709-102"
|
||||
"166","desert","outside-desert-spindash-732-102-3"
|
||||
"167","desert","d2-entrance-528-96"
|
||||
"168","desert","d2-entrance-pumpless-532-97"
|
||||
"169","desert","tile-room1-458"
|
||||
"170","desert","bridge-539-58"
|
||||
"171","desert","popos-546"
|
||||
"172","desert","beamos-hall-706-1"
|
||||
"173","desert","beamos-hall-rta-720"
|
||||
"174","desert","tile-room2-517-21"
|
||||
"175","desert","torches-nomenu-1549-0-0"
|
||||
"176","desert","torches-rta-1656-0-4"
|
||||
"177","desert","lanmos-2cyc-1953"
|
||||
"178","desert","lanmos-2cyc-2059"
|
||||
"179","hera","outside-desert-cactusdash-1044-77-0"
|
||||
"180","hera","outside-desert-geldmandash-1053-76-0"
|
||||
"181","hera","outside-desert-rta-highdash-1109-76-0"
|
||||
"182","hera","outside-desert-rta-lowdash-1116-76-0"
|
||||
"183","hera","middle-aged-man-634-30-0"
|
||||
"184","hera","watergate-458-34-0"
|
||||
"185","hera","beach-445-35-0"
|
||||
"186","hera","beach-rta-530-35-0"
|
||||
"187","hera","fakeflips-832-36-0"
|
||||
"188","hera","fakeflips-rta-808-35-0"
|
||||
"189","hera","whirlpool-enter-336-36-0"
|
||||
"190","hera","whirlpool-exit-806-72-0"
|
||||
"191","hera","rupee-tree-picklearrow-808-35-0"
|
||||
"192","hera","rupee-tree-rta-821-35-0"
|
||||
"193","hera","old-man-cave-1026-134-0"
|
||||
"194","hera","old-man-tunnel-2139-295-8"
|
||||
"195","hera","death-mountain-lower-3039-246-009"
|
||||
"196","hera","bunny-link-739"
|
||||
"197","hera","death-mountain-upper-ledgehop-736-76-0"
|
||||
"198","hera","death-mountain-upper-rta-748-76-0"
|
||||
"199","hera","lobby1-503-101-0"
|
||||
"200","hera","lobby1-pumpless-507-101-0"
|
||||
"201","hera","basement-key-629-71-0"
|
||||
"202","hera","lobby2-boom-859-107-007"
|
||||
"203","hera","lobby2-boomdash-851-107-010"
|
||||
"204","hera","lobby2-boomless-824"
|
||||
"205","hera","tileroom-boomdash-4340-66-0"
|
||||
"206","hera","tileroom-boomless-4326"
|
||||
"207","hera","3mold-boom-menu-429-0-2"
|
||||
"208","hera","3mold-boomless-538"
|
||||
"209","hera","torches-812-31-008"
|
||||
"210","hera","lobby3-540-107-0"
|
||||
"211","hera","beetles-936-63-0"
|
||||
"212","hera","bkdoor-342-0-0"
|
||||
"213","hera","bkdoor-pumpless-345-0-0"
|
||||
"214","hera","safety-switch-634"
|
||||
"215","hera","safety-switch-pumpless-dash-639"
|
||||
"216","hera","safety-switch-pumpless-walk-639"
|
||||
"217","hera","bigchest-ebj-2143-95-17"
|
||||
"218","hera","bigchest-waffle-rta-2324-95-20"
|
||||
"219","hera","bigchest-waffle-sparkmanip-2301-95-18"
|
||||
"220","hera","bumper-skip-729-66-0"
|
||||
"221","hera","moldorm-2752-116-0"
|
||||
"222","hera","moldorm-2858-116-0"
|
||||
"223","atower","death-mountain-upper-943"
|
||||
"224","atower","kak-tunnel-01-806"
|
||||
"225","atower","kak-tunnel-02-607"
|
||||
"226","atower","kak-tunnel-02-arrows-835"
|
||||
"227","atower","kak-tunnel-02-rta-710"
|
||||
"228","atower","first-rupee-tree-928"
|
||||
"229","atower","first-rupee-tree-birddash-1029"
|
||||
"230","atower","first-rupee-tree-rta-x4FA-exit-921"
|
||||
"231","atower","lumberjacks-652"
|
||||
"232","atower","lumberjacks-picklearrow-y078-enter-455"
|
||||
"233","atower","lumberjacks-rta-y078-enter-701"
|
||||
"234","atower","lost-woods-01-1709"
|
||||
"235","atower","lost-woods-01-y078-enter-1713"
|
||||
"236","atower","master-sword-3909"
|
||||
"237","atower","lost-woods-02-2252"
|
||||
"238","atower","lost-woods-02-rta-2243"
|
||||
"239","atower","fortune-teller-hut-rta-619"
|
||||
"240","atower","whirlpool-pond-348"
|
||||
"241","atower","wsb-543"
|
||||
"242","atower","outside-hyrule-castle-1000"
|
||||
"243","atower","castle-lobby-abovetorch-531"
|
||||
"244","atower","castle-lobby-rta-540"
|
||||
"245","atower","sw-room-455-bad-recording"
|
||||
"246","atower","sw-room-456"
|
||||
"247","atower","ramparts-617"
|
||||
"248","atower","entrance-334"
|
||||
"249","atower","goldknights-pui-734"
|
||||
"250","atower","prizepack-guards-703"
|
||||
"251","atower","first-dark-room-605"
|
||||
"252","atower","first-dark-room-rta-619"
|
||||
"253","atower","despair-1617-44"
|
||||
"254","atower","last-3f-dark-room-436"
|
||||
"255","atower","first-4f-dark-room-625"
|
||||
"256","atower","first-4f-dark-room-pumpless-628"
|
||||
"257","atower","melancholy-rta-715"
|
||||
"258","atower","archerkey-beams-keydash-534"
|
||||
"259","atower","archerkey-beams-rta-558"
|
||||
"260","atower","redspearguards-809"
|
||||
"261","atower","alert-guards-arrowkill-516"
|
||||
"262","atower","alert-guards-beamkill-528"
|
||||
"263","atower","cop-menu-638"
|
||||
"264","atower","neopolitan-room-325"
|
||||
"265","atower","statue-room-646"
|
||||
"266","atower","catwalk-boom-624"
|
||||
"267","atower","catwalk-boomless-621-bad-recording"
|
||||
"268","atower","7f-hallway-521"
|
||||
"269","atower","agah-cutscene-2451"
|
||||
"270","atower","agah-0bb-4451"
|
||||
"271","pod","pyramid-1043"
|
||||
"272","pod","dark-octo-319"
|
||||
"273","pod","hammer-bridge-444"
|
||||
"274","pod","dark-east-fairy-cave-250"
|
||||
"275","pod","outside-4157"
|
||||
"276","pod","entrance1-dash-554"
|
||||
"277","pod","entrance1-walk-556"
|
||||
"278","pod","west-bomb-pickup-336"
|
||||
"279","pod","shooter-key-847"
|
||||
"280","pod","entrance2-333"
|
||||
"281","pod","bomb-pickup1-428"
|
||||
"282","pod","junction1-ledgehop-524"
|
||||
"283","pod","junction1-slashjelly-556"
|
||||
"284","pod","turtle-key-619"
|
||||
"285","pod","entrance3-333"
|
||||
"286","pod","bomb-pickup2-412"
|
||||
"287","pod","junction2-907"
|
||||
"288","pod","junction2-badrng-917"
|
||||
"289","pod","upper-turtle-key-715"
|
||||
"290","pod","bigkey-leftside-754"
|
||||
"291","pod","entrance4-333"
|
||||
"292","pod","bomb-pickup3-412"
|
||||
"293","pod","junction3-651"
|
||||
"294","pod","beetle-room1-954"
|
||||
"295","pod","beetle-room1-dash2chest-1002"
|
||||
"296","pod","beetle-room1-rta-1012"
|
||||
"297","pod","hammeryump-1bombpickup-1324"
|
||||
"298","pod","hammeryump-2bombpickup-1348"
|
||||
"299","pod","darkmaze-738"
|
||||
"300","pod","entrance5-333"
|
||||
"301","pod","bomb-pickup4-412"
|
||||
"302","pod","junction4-651"
|
||||
"303","pod","beetle-room2-dash-and-hop-644"
|
||||
"304","pod","beetle-room2-rta-walk-702"
|
||||
"305","pod","beetle-room2-walk-and-hop-657"
|
||||
"306","pod","sexy-statue-1333"
|
||||
"307","pod","ugly-statue-1406"
|
||||
"308","pod","mimics-454"
|
||||
"309","pod","eye-statue-dashes-2454"
|
||||
"310","pod","eye-statue-walk-rta-2456"
|
||||
"311","pod","darkpegs-607"
|
||||
"312","pod","lonely-turtle-457"
|
||||
"313","pod","turtle-party-701-cropped"
|
||||
"314","pod","turtle-party-701"
|
||||
"315","pod","turtle-party-809"
|
||||
"316","pod","warp-tile-512"
|
||||
"317","pod","turtle-hallway-dash-and-keydash-709"
|
||||
"318","pod","turtle-hallway-rta-walk-and-slash-745"
|
||||
"319","pod","turtle-hallway-walk-and-keydash-720"
|
||||
"320","pod","helma-2739"
|
||||
"321","pod","helma-2813"
|
||||
"322","pod","helma-2830"
|
||||
"323","pod","helma-2843"
|
||||
"324","pod","helma-2927"
|
||||
"325","thieves","outside-pod-2627"
|
||||
"326","thieves","dark-east-fairy-cave-259"
|
||||
"327","thieves","pegbridge-earlydash-639"
|
||||
"328","thieves","pegbridge-safedash-646"
|
||||
"329","thieves","bombshop-359"
|
||||
"330","thieves","annoying-bushes-402"
|
||||
"331","thieves","annoying-bushes-rightcancel-402"
|
||||
"332","thieves","southeast-of-fluteboy-dash-334"
|
||||
"333","thieves","southeast-of-fluteboy-walk-rta-328"
|
||||
"334","thieves","south-of-fluteboy-458"
|
||||
"335","thieves","south-of-fluteboy-walk-rta-508"
|
||||
"336","thieves","fluteboy-rta-1503"
|
||||
"337","thieves","grove-rta-1840"
|
||||
"338","thieves","south-of-grove-445"
|
||||
"339","thieves","grove-westside-236"
|
||||
"340","thieves","usain-bolt-720"
|
||||
"341","thieves","kak-village-centerdash-3335"
|
||||
"342","thieves","kak-village-leftdash-3335"
|
||||
"343","thieves","three-musketeers-3xdash-557"
|
||||
"344","thieves","lost-woods-830"
|
||||
"345","thieves","warp-rock-705"
|
||||
"346","thieves","warp-rock-no-hammerdash-724"
|
||||
"347","thieves","north-of-outcast-748"
|
||||
"348","thieves","voo-943"
|
||||
"349","thieves","sw-quad-badrng-745"
|
||||
"350","thieves","sw-quad-goodrng-736"
|
||||
"351","thieves","nw-quad-333"
|
||||
"352","thieves","ne-quad-badrng-350"
|
||||
"353","thieves","ne-quad-goodrng-337"
|
||||
"354","thieves","se-quad1-551"
|
||||
"355","thieves","bigkey-610"
|
||||
"356","thieves","se-quad2-628"
|
||||
"357","thieves","ne-quad2-733"
|
||||
"358","thieves","stalfos-hallway-hammer-755"
|
||||
"359","thieves","stalfos-hallway-pickup-754"
|
||||
"360","thieves","snek-and-zazaks-335"
|
||||
"361","thieves","conveyor-gibos-north-352"
|
||||
"362","thieves","conveyor-gibos-north-353"
|
||||
"363","thieves","hellway-429"
|
||||
"364","thieves","spikeroom1-hammer-515"
|
||||
"365","thieves","spikeroom1-mikestrat-502"
|
||||
"366","thieves","attic-pot-switch1-badrng-828"
|
||||
"367","thieves","attic-pot-switch1-goodrng-pickup-750"
|
||||
"368","thieves","grasshopper-hall1-1-252"
|
||||
"369","thieves","grasshopper-hall2-1-308"
|
||||
"370","thieves","attic-window-slashgrass-556"
|
||||
"371","thieves","grasshopper-hall2-2-240"
|
||||
"372","thieves","grasshopper-hall1-2-307"
|
||||
"373","thieves","attic-pot-switch2-306"
|
||||
"374","thieves","spikeroom2-606"
|
||||
"375","thieves","hellway2-322"
|
||||
"376","thieves","zazaks-and-gibos-543"
|
||||
"377","thieves","zazaks-and-gibos-545"
|
||||
"378","thieves","conveyor-toilet-bomb-404"
|
||||
"379","thieves","conveyor-toilet-nobomb-321"
|
||||
"380","thieves","bigblock-837"
|
||||
"381","thieves","lonely-zazak-315"
|
||||
"382","thieves","prison-dashes-1053"
|
||||
"383","thieves","prison-walk-1106"
|
||||
"384","thieves","prison-walk-oneslash-1124"
|
||||
"385","thieves","lonely-zazak2-252"
|
||||
"386","thieves","conveyor-jellies1-328"
|
||||
"387","thieves","bigchest-606"
|
||||
"388","thieves","conveyor-jellies2-509"
|
||||
"389","thieves","bigblock2-arrows-412"
|
||||
"390","thieves","bigblock2-noarrows-345"
|
||||
"391","thieves","conveyor-toilet2-dash-hammer-736"
|
||||
"392","thieves","conveyor-toilet2-hammerdash-726"
|
||||
"393","thieves","conveyor-toilet2-rta-751"
|
||||
"394","thieves","stalfos-hallway2-324"
|
||||
"395","thieves","blind-beams-2701"
|
||||
"396","thieves","blind-beams-walkin-2707"
|
||||
"397","skull","voo1-902"
|
||||
"398","skull","voo1-rta-914"
|
||||
"399","skull","300-hut-721"
|
||||
"400","skull","300-hut-rta-720"
|
||||
"401","skull","voo2-dash-628"
|
||||
"402","skull","voo2-walk-630"
|
||||
"403","skull","cursed-dwarf-justpressa-1210"
|
||||
"404","skull","cursed-dwarf-rta-1224"
|
||||
"405","skull","voo3-339"
|
||||
"406","skull","hammerpegs1-820"
|
||||
"407","skull","outside-smiths1-350"
|
||||
"408","skull","smiths1-708"
|
||||
"409","skull","outside-smiths2-237"
|
||||
"410","skull","smiths2-910"
|
||||
"411","skull","outside-smiths3-239"
|
||||
"412","skull","hammerpegs2-342"
|
||||
"413","skull","outside-smiths4-338"
|
||||
"414","skull","smiths3-746"
|
||||
"415","skull","outside-smiths5-236"
|
||||
"416","skull","hammerpegs3-849"
|
||||
"417","skull","voo4-fencedash-441"
|
||||
"418","skull","c-shaped-house-918"
|
||||
"419","skull","voo5-709"
|
||||
"420","skull","moblins-badrng-524"
|
||||
"421","skull","moblins-goodrng-518"
|
||||
"422","skull","skeleton-forest1-1216"
|
||||
"423","skull","mummy-statue-1220"
|
||||
"424","skull","bigkey-badrng-659"
|
||||
"425","skull","bigkey-leftside-620"
|
||||
"426","skull","bigkey-rightside-635"
|
||||
"427","skull","mumm-statue-exit-232"
|
||||
"428","skull","skeleton-forest2-949"
|
||||
"429","skull","bigchest-earlybj-1259"
|
||||
"430","skull","bigchest-rta-bonk-1407"
|
||||
"431","skull","bigchest-rta-bonkless-1406"
|
||||
"432","skull","skeleton-forest3-933"
|
||||
"433","skull","mummy-statue-passthru-427"
|
||||
"434","skull","bumper-hallway-305"
|
||||
"435","skull","potkey-654"
|
||||
"436","skull","skeleton-forest4-738"
|
||||
"437","skull","skeleton-forest4-rta-740"
|
||||
"438","skull","firesnake-keydash-522"
|
||||
"439","skull","potpit-left-442"
|
||||
"440","skull","potpit-right-438"
|
||||
"441","skull","mummy-hellway-744"
|
||||
"442","skull","mummy-hellway-joestrat-812"
|
||||
"443","skull","vineroom-badrng-415"
|
||||
"444","skull","vineroom-goodrng-359"
|
||||
"445","skull","mummy-key-629"
|
||||
"446","skull","mummy-key-rta-633"
|
||||
"447","skull","mothhole-top-422"
|
||||
"448","skull","mothula-1118"
|
||||
"449","skull","mothula-1122"
|
||||
"450","ice","outside-skull-menu-352"
|
||||
"451","ice","lost-woods-dash-758"
|
||||
"452","ice","lost-woods-walk-806"
|
||||
"453","ice","links-house-632"
|
||||
"454","ice","castle-gate-menu-rta-qw-637"
|
||||
"455","ice","castle-gate-menu-walk-qw-639"
|
||||
"456","ice","castle-gate-walk-qw-534"
|
||||
"457","ice","pyramid-659"
|
||||
"458","ice","dark-octofield-236"
|
||||
"459","ice","broken-bridge-738"
|
||||
"460","ice","lonely-ropa-243"
|
||||
"461","ice","ropa-lottery-910"
|
||||
"462","ice","dark-cuckoos-leftgrab-737"
|
||||
"463","ice","dark-cuckoos-rta-746"
|
||||
"464","ice","quake-1925"
|
||||
"465","ice","quake-earlythrow-1858"
|
||||
"466","ice","whirlpool1-dashcancel-605"
|
||||
"467","ice","whirlpool1-nocancel-603"
|
||||
"468","ice","zoras-domain-dashout-5934"
|
||||
"469","ice","zoras-domain-walkout-5933"
|
||||
"470","ice","tiny-warp-dik-605"
|
||||
"471","ice","ice-warp-833"
|
||||
"472","ice","ice-island-358"
|
||||
"473","ice","ice-entrance-438"
|
||||
"474","ice","ice2-508"
|
||||
"475","ice","floor-switch-910"
|
||||
"476","ice","block-intersection1-358"
|
||||
"477","ice","compass-room-144"
|
||||
"478","ice","block-intersection2-456"
|
||||
"479","ice","penguins1-spin-535"
|
||||
"480","ice","penguins1-tmstrat-523"
|
||||
"481","ice","block-intersection3-512"
|
||||
"482","ice","bombable-floor-dboost-916"
|
||||
"483","ice","bombable-floor-nodboost-944"
|
||||
"484","ice","bombable-floor-rta-good-rng-957"
|
||||
"485","ice","big-stalfos-819"
|
||||
"486","ice","conveyor-hellway-709"
|
||||
"487","ice","ipbj-1209"
|
||||
"488","ice","floor-zols-300"
|
||||
"489","ice","penguins2-804"
|
||||
"490","ice","big-spike-405"
|
||||
"491","ice","lonely-firebar-419"
|
||||
"492","ice","lonely-firebar-dash-451"
|
||||
"493","ice","double-freezor-503"
|
||||
"494","ice","big-chest-401"
|
||||
"495","ice","big-pit-351"
|
||||
"496","ice","block-push-hammerpot-badlag-542"
|
||||
"497","ice","block-push-potpickup-badlag-539"
|
||||
"498","ice","statue-room-hammer-both-pots-1323"
|
||||
"499","ice","statue-room-hammer-one-pot-1306"
|
||||
"500","ice","statue-room-pickup-both-pots-1318"
|
||||
"501","ice","statue-room-pickup-one-pot-1304"
|
||||
"502","ice","kholdstare-1poke-1621"
|
||||
"503","ice","kholdstare-2poke-1559"
|
||||
"504","ice","kholdstare-2poke-1602"
|
||||
"505","ice","kholdstare-6slash-1655"
|
||||
"506","swamp","ice-island-343"
|
||||
"507","swamp","lake-hylia-birddash-803"
|
||||
"508","swamp","lake-hylia-walk-812"
|
||||
"509","swamp","links-house-521"
|
||||
"510","swamp","grassy-area-menu-437"
|
||||
"511","swamp","warp-nokill-422"
|
||||
"512","swamp","warp-octokill-437"
|
||||
"513","swamp","postwarp-hammerdash-950"
|
||||
"514","swamp","postwarp-walk-959"
|
||||
"515","swamp","outside-swamp1-noqw-629"
|
||||
"516","swamp","outside-swamp1-qw-617"
|
||||
"517","swamp","outside-watergate-noqw-427"
|
||||
"518","swamp","outside-watergate-qw-407"
|
||||
"519","swamp","watergate-entrance-mirrordash-455"
|
||||
"520","swamp","watergate-entrance-walk-500"
|
||||
"521","swamp","afskip-715"
|
||||
"522","swamp","afskip-bonk-736"
|
||||
"523","swamp","afskip-rta-732"
|
||||
"524","swamp","watergate-entrance2-317"
|
||||
"525","swamp","outside-watergate2-closewarp-236"
|
||||
"526","swamp","outside-watergate2-qw-413"
|
||||
"527","swamp","outside-swamp2-closewarp-424"
|
||||
"528","swamp","outside-swamp2-qw-352"
|
||||
"529","swamp","dungeon-entrance-1017"
|
||||
"530","swamp","potkey1-menu-1050"
|
||||
"531","swamp","potkey1-nomenu-923"
|
||||
"532","swamp","pool1-empty-627"
|
||||
"533","swamp","potkey2-dash-336"
|
||||
"534","swamp","potkey2-walk-339"
|
||||
"535","swamp","pool1-empty2-dash-515"
|
||||
"536","swamp","pool1-empty2-walk-514"
|
||||
"537","swamp","waterlever1-1232"
|
||||
"538","swamp","pool1-full-542"
|
||||
"539","swamp","bigchest1-839"
|
||||
"540","swamp","pool2-empty-710"
|
||||
"541","swamp","potkey3-dash-336"
|
||||
"542","swamp","potkey3-walk-339"
|
||||
"543","swamp","pool2-empty2-554"
|
||||
"544","swamp","bigchest2-759"
|
||||
"545","swamp","waterlever2-1355"
|
||||
"546","swamp","bigchest3-844"
|
||||
"547","swamp","pool2-full1-hammerdash-920"
|
||||
"548","swamp","pool2-full1-rta-939"
|
||||
"549","swamp","jelly-dash-1015"
|
||||
"550","swamp","sociable-firebar-1030"
|
||||
"551","swamp","jellydash-northside-433"
|
||||
"552","swamp","bigkey-719"
|
||||
"553","swamp","jelly-dash2-928"
|
||||
"554","swamp","pool2-full2-dboost-907"
|
||||
"555","swamp","pool2-full2-hammerdash-925"
|
||||
"556","swamp","pool2-full2-rta-936"
|
||||
"557","swamp","bigchest4-2026"
|
||||
"558","swamp","bigchest4-rta-2112"
|
||||
"559","swamp","statue-room-arrows-1205"
|
||||
"560","swamp","statue-room-no-arrows-1127"
|
||||
"561","swamp","red-jelly-2slash-351"
|
||||
"562","swamp","red-jelly-beam-340"
|
||||
"563","swamp","red-jelly-dash-326"
|
||||
"564","swamp","water-lever3-1146"
|
||||
"565","swamp","smallhall-313"
|
||||
"566","swamp","waterfall-room-509"
|
||||
"567","swamp","restock-all-448"
|
||||
"568","swamp","restock-arrows-only-422"
|
||||
"569","swamp","restock-bomb-only-420"
|
||||
"570","swamp","restock-skip-dash-330"
|
||||
"571","swamp","restock-skip-walk-334"
|
||||
"572","swamp","c-room-602"
|
||||
"573","swamp","phelps-way-943"
|
||||
"574","swamp","t-room-234"
|
||||
"575","swamp","arrghus-frqk-1737"
|
||||
"576","swamp","arrghus-frqk-1745"
|
||||
"577","swamp","arrghus-frqk-1748"
|
||||
"578","swamp","arrghus-noqk-1902"
|
||||
"579","swamp","arrghus-noqk-1930"
|
||||
"580","mire","outside-swamp-357"
|
||||
"581","mire","outside-swamp-from-fr-341"
|
||||
"582","mire","outside-swamp-from-fr-with-qw-348"
|
||||
"583","mire","outside-swamp-from-mirror-qw-236"
|
||||
"584","mire","outside-watergate-852"
|
||||
"585","mire","outside-watergate-from-qw-836"
|
||||
"586","mire","dm-both-swordclimbs-2145"
|
||||
"587","mire","dm-hookspeed-noswordclimbs-2202"
|
||||
"588","mire","dm-hybrid-2205"
|
||||
"589","mire","dm-spindash-2123"
|
||||
"590","mire","dm-spindash-2134"
|
||||
"591","mire","dm-spindash-dmgcancel-2111"
|
||||
"592","mire","dark-dm-534"
|
||||
"593","mire","ether-dashoff-2305"
|
||||
"594","mire","ether-quickhop-2243"
|
||||
"595","mire","octoballoon-610"
|
||||
"596","mire","icerod-entrance-931"
|
||||
"597","mire","icerod1-334"
|
||||
"598","mire","icerodchest-nomenu-659"
|
||||
"599","mire","icerodchest-rta-menu-815"
|
||||
"600","mire","icerod2-menu-350"
|
||||
"601","mire","icerod2-rta-nomenu-233"
|
||||
"602","mire","icerod-leaving-547"
|
||||
"603","mire","icerod-leaving-rta-556"
|
||||
"604","mire","mirewarp-menu-701"
|
||||
"605","mire","mire-entrance-nomenu-2501"
|
||||
"606","mire","mire01-821"
|
||||
"607","mire","mire02-1031"
|
||||
"608","mire","mainhub1-toproute-947"
|
||||
"609","mire","poporoom1-337"
|
||||
"610","mire","spikekey1-351"
|
||||
"611","mire","poporoom2-337"
|
||||
"612","mire","beatthefireball-938"
|
||||
"613","mire","jellykey-449"
|
||||
"614","mire","tileroom-321"
|
||||
"615","mire","bombslugs-508"
|
||||
"616","mire","torches1-752"
|
||||
"617","mire","torches2-rta-2127"
|
||||
"618","mire","torches2-toplighting-2121"
|
||||
"619","mire","bighole-322"
|
||||
"620","mire","bigkey-621"
|
||||
"621","mire","warptile-230"
|
||||
"622","mire","wizzroom-412"
|
||||
"623","mire","bigspike-318"
|
||||
"624","mire","lonelystalfos-337"
|
||||
"625","mire","sparkgamble-bestboost-1106"
|
||||
"626","mire","sparkgamble-damageless-1144"
|
||||
"627","mire","sparkgamble-rta-menu-1236"
|
||||
"628","mire","sparkgamble-snekblock-1205"
|
||||
"629","mire","maproom-south-327"
|
||||
"630","mire","maproom-south-rta-327"
|
||||
"631","mire","bigchest-menu-1012"
|
||||
"632","mire","bigchest-nomenu-852"
|
||||
"633","mire","maproom-north-328"
|
||||
"634","mire","spikeykey2-rta-walk-702"
|
||||
"635","mire","spikeykey2-rta-walk-magicgrab-753"
|
||||
"636","mire","spikeykey2-rta-walk-magicgrab-with-hook-752"
|
||||
"637","mire","jadinledge-hookdash-333"
|
||||
"638","mire","jadinledge-quickhop-328"
|
||||
"639","mire","jadinledge-rta-2dash-332"
|
||||
"640","mire","wizzpot-rta-hook-610"
|
||||
"641","mire","wizzpot-topdash-558"
|
||||
"642","mire","bridge-504"
|
||||
"643","mire","caneblockswitch-old-928"
|
||||
"644","mire","caneblockswitch-spooky-934"
|
||||
"645","mire","bigblock-429"
|
||||
"646","mire","caneswitch-spooky-1132"
|
||||
"647","mire","caneswitch-spooky-roddash-bonk-1108"
|
||||
"648","mire","bombwall-spooky-dashout-513"
|
||||
"649","mire","bombwall-spooky-dashout-risky-var-443"
|
||||
"650","mire","bombwall-spooky-walk-534"
|
||||
"651","mire","badfarmroom-spooky-dash-above-612"
|
||||
"652","mire","badfarmroom-spooky-dash-below-608"
|
||||
"653","mire","badfarmroom-spooky-riskier-walk-619"
|
||||
"654","mire","badfarmroom-spooky-rta-walk-624"
|
||||
"655","mire","firesnek-skip-menu-956"
|
||||
"656","mire","firesnek-skip-rta-nomenu-909"
|
||||
"657","mire","firesnek-skip-rta-nomenu-915"
|
||||
"658","mire","vitty-nomenu-1732"
|
||||
"659","mire","vitty-rta-menu-1846"
|
||||
"660","?","?"
|
||||
"661","trock","outside-mire-335"
|
||||
"662","trock","outside-desert-818"
|
||||
"663","trock","wafflehouse-drivethru-1241"
|
||||
"664","trock","wafflehouse-drivethru-nostairclimb-1243"
|
||||
"665","trock","broken-bridge-1034"
|
||||
"666","trock","broken-bridge-fromfacingup-1037"
|
||||
"667","trock","paradox-lower-454"
|
||||
"668","trock","paradox-upper-740"
|
||||
"669","trock","run-killing-deadrocks-525"
|
||||
"670","trock","hammerpegs-1251"
|
||||
"671","trock","outside-trock-2057"
|
||||
"672","trock","outside-trock-rta-1957"
|
||||
"673","trock","dungeon-entrance-menu-933"
|
||||
"674","trock","dungeon-entrance-no-menu-818"
|
||||
"675","trock","largepit1-928"
|
||||
"676","trock","torches-1428"
|
||||
"677","trock","torches-rta-1432"
|
||||
"678","trock","rollerroom-1038"
|
||||
"679","trock","rollerroom-topdmg-1032"
|
||||
"680","trock","torches-backtrack-346"
|
||||
"681","trock","largepit2-1025"
|
||||
"682","trock","pokey0-526"
|
||||
"683","trock","pokey0-rta-551"
|
||||
"684","trock","chomps-2blocks-805"
|
||||
"685","trock","chomps-bbb-758"
|
||||
"686","trock","chomps-blocknbeam-748"
|
||||
"687","trock","tunnels-arrows-2040"
|
||||
"688","trock","tunnels-no-arrows-1948"
|
||||
"689","trock","lava-room1-739"
|
||||
"690","trock","pokey1-bl-keydash-849"
|
||||
"691","trock","bigkey-fromdash-1245"
|
||||
"692","trock","bigkey-fromwalk-1241"
|
||||
"693","trock","pokey1-backtrack-beamless-644"
|
||||
"694","trock","pokey1-backtrack-beams-632"
|
||||
"695","trock","pokey1-backtrack-canedash-624"
|
||||
"696","trock","lava-room3-1247"
|
||||
"697","trock","double-pokeys-429"
|
||||
"698","trock","miniroller-2dash-339"
|
||||
"699","trock","lavaroom4-619"
|
||||
"700","trock","walldash-414"
|
||||
"701","trock","crystalroller-beams-812"
|
||||
"702","trock","darkroom-2428"
|
||||
"703","trock","helmadash1-623"
|
||||
"704","trock","laserskip-block-921"
|
||||
"705","trock","laserskip-dash-823"
|
||||
"706","trock","helmadash2-414"
|
||||
"707","trock","helmadash2-rta-417"
|
||||
"708","trock","canedash-725[30lf]"
|
||||
"709","trock","canedash-725[31lf]"
|
||||
"710","trock","canedash-magicless-814"
|
||||
"711","trock","canedash-rta-walk-823"
|
||||
"712","trock","restock-graball-1238"
|
||||
"713","trock","restock-magicgrab-1232"
|
||||
"714","trock","restock-skipall-1145"
|
||||
"715","trock","trinexx-rta-3759"
|
||||
"716","gtower","outside-trock-454"
|
||||
"717","gtower","lynel-bridge-909"
|
||||
"718","gtower","entrance-2239"
|
||||
"719","gtower","entrance-nostairclimb-2251"
|
||||
"720","gtower","foyer-624"
|
||||
"721","gtower","torchkey-bonkandwalk-759"
|
||||
"722","gtower","torchkey-hook-758"
|
||||
"723","gtower","torchkey-nokey-606"
|
||||
"724","gtower","conveyor-potkey-905"
|
||||
"725","gtower","spikeskip-919"
|
||||
"726","gtower","spikeskip-noskip-937"
|
||||
"727","gtower","double-crystal-switch-719"
|
||||
"728","gtower","double-crystal-switch-rta-739"
|
||||
"729","gtower","double-crystal-switch-rta-740"
|
||||
"730","gtower","spike-and-pegs-356"
|
||||
"731","gtower","firesnake-room-1029"
|
||||
"732","gtower","firesnake-room-bonk-1117"
|
||||
"733","gtower","firesnake-room-framerule-1011"
|
||||
"734","gtower","warp-tile1-157"
|
||||
"735","gtower","warp-tile2-344"
|
||||
"736","gtower","warp-tile2-justholddown-350"
|
||||
"737","gtower","warp-tile3-430"
|
||||
"738","gtower","warp-tileskip-816"
|
||||
"739","gtower","warp-tileskip-with-menu-931"
|
||||
"740","gtower","false-floor-no-menu-1017"
|
||||
"741","gtower","false-floor-with-menu-1122"
|
||||
"742","gtower","bombable-floor-717"
|
||||
"743","gtower","icearmos-1529"
|
||||
"744","gtower","icearmos-321-1548"
|
||||
"745","gtower","icearmos-321-dboost-1546"
|
||||
"746","gtower","bk-arrows-738"
|
||||
"747","gtower","bk-no-arrows-606"
|
||||
"748","gtower","foyer2-745"
|
||||
"749","gtower","mj-room-1045-arrow-dash"
|
||||
"750","gtower","mimics1-joestrat-647"
|
||||
"751","gtower","mimics1-myramics-653"
|
||||
"752","gtower","mimics2-blunt-553"
|
||||
"753","gtower","mimics2-opt-519"
|
||||
"754","gtower","east-spike-room-302"
|
||||
"755","gtower","spiketrap-1341"
|
||||
"756","gtower","spiketrap-abovepot-1406"
|
||||
"757","gtower","gbz-513"
|
||||
"758","gtower","gbz-walk-637"
|
||||
"759","gtower","g1-838"
|
||||
"760","gtower","g2-441"
|
||||
"761","gtower","g3-644"
|
||||
"762","gtower","g4-446"
|
||||
"763","gtower","g5-459"
|
||||
"764","gtower","bunnybeamhall-305"
|
||||
"765","gtower","lanmo2-1141"
|
||||
"766","gtower","restock-248"
|
||||
"767","gtower","wizz1-849"
|
||||
"768","gtower","guardbridge-529"
|
||||
"769","gtower","wizz2-429"
|
||||
"770","gtower","foosdabridge-653"
|
||||
"771","gtower","foosdabridge-rightdash-703"
|
||||
"772","gtower","torches1-1251-magic-noroddash"
|
||||
"773","gtower","eyelasers-529"
|
||||
"774","gtower","torches2-637"
|
||||
"775","gtower","torches2-safewalk-647"
|
||||
"776","gtower","helmakey-500-dmg"
|
||||
"777","gtower","helmakey-507-dmgless"
|
||||
"778","gtower","bombwall-521"
|
||||
"779","gtower","bombwall-damageless-530"
|
||||
"780","gtower","bombwall-rta-543"
|
||||
"781","gtower","pegschestkey-843"
|
||||
"782","gtower","pegschestkey-magicskip-454"
|
||||
"783","gtower","pegschestkey-safe-634"
|
||||
"784","gtower","mold2-hover-1232"
|
||||
"785","gtower","mold2-hover-1301"
|
||||
"786","gtower","mold2-hover-1337"
|
||||
"787","gtower","mold2-kill-hook-1949"
|
||||
"788","gtower","mold2-kill-hook-1958"
|
||||
"789","gtower","helma-hallway-607"
|
||||
"790","gtower","helma-hallway-safe-620"
|
||||
"791","gtower","torch-hallway-635"
|
||||
"792","gtower","agah2-4927"
|
||||
"793","?","?"
|
||||
"794","?","?"
|
||||
"795","?","?"
|
||||
"796","?","?"
|
||||
"797","?","?"
|
||||
"798","ganon","ganon-139.55-nfc"
|
||||
"799","ganon","ganon-139.55"
|
||||
"800","?","?"
|
||||
"801","?","?"
|
||||
"802","?","?"
|
||||
"803","?","?"
|
||||
"804","?","?"
|
||||
"805","?","?"
|
||||
"806","?","?"
|
||||
"807","?","?"
|
||||
"808","?","?"
|
||||
"809","?","?"
|
||||
"810","?","?"
|
||||
"811","?","?"
|
||||
"812","?","?"
|
||||
"813","?","?"
|
||||
"814","?","?"
|
||||
"815","?","?"
|
||||
"816","?","?"
|
||||
|
818
rooms-list.txt
818
rooms-list.txt
@@ -1,818 +0,0 @@
|
||||
'ID','Dungeon','Room'
|
||||
'0','?','links-house-2911'
|
||||
'1','?','outside-links-house-723'
|
||||
'2','?','outside-castle-1628'
|
||||
'3','?','outside-castle-1631'
|
||||
'4','?','uncle-1342'
|
||||
'5','?','uncle-1348'
|
||||
'6','?','passage-exit-442'
|
||||
'7','?','courtyard-923'
|
||||
'8','?','castle-lobby-631'
|
||||
'9','?','castle-lobby-pumpless-636'
|
||||
'10','?','sw-room-439'
|
||||
'11','?','sw-room-pumpless-448'
|
||||
'12','?','west-guard-hallway1-603'
|
||||
'13','?','statue-hallway1-415'
|
||||
'14','?','1st-keyguard-leftslash-801'
|
||||
'15','?','first-keyguard1-3slash-825'
|
||||
'16','?','first-keyguard1-upspin-811'
|
||||
'17','?','b1-pit-lower-404'
|
||||
'18','?','b1-pit2-lower-945'
|
||||
'19','?','stealth-room-927'
|
||||
'20','?','stealth-room-929'
|
||||
'21','?','green-guard-bestrng-432'
|
||||
'22','?','green-guard-bestrng-rta-438'
|
||||
'23','?','blue-boomguard-739'
|
||||
'24','?','blue-boomguard-skip-627'
|
||||
'25','?','green-guard2-426'
|
||||
'26','?','stairs-to-b2-1-359'
|
||||
'27','?','b2-1-533'
|
||||
'28','?','bnc-1pot4slash-3227'
|
||||
'29','?','bnc-8slash-3120'
|
||||
'30','?','bnc-8slash-3130'
|
||||
'31','?','bnc-joestrat-3238'
|
||||
'32','?','bnc-joestrat-3244'
|
||||
'33','?','b2-2-530'
|
||||
'34','?','stairs-to-b2-2-651'
|
||||
'35','?','stairs-to-b2-2-652'
|
||||
'36','?','green-guard3-426'
|
||||
'37','?','stealth-room2-920'
|
||||
'38','?','b1-pit2-upper-301'
|
||||
'39','?','b1-pit1-upper-627'
|
||||
'40','?','b1-pit1-upper-pumpless-628'
|
||||
'41','?','1st-keyguard2-314'
|
||||
'42','?','statue-hallway2-709'
|
||||
'43','?','west-guard-hallway2-612'
|
||||
'44','?','sw-room2-445'
|
||||
'45','?','castle-lobby2-721'
|
||||
'46','?','throne-room-1632'
|
||||
'47','?','throne-room-1634'
|
||||
'48','?','sewer-passage-857'
|
||||
'49','?','sewer-passage-pumpless-903'
|
||||
'50','?','snake-room-700'
|
||||
'51','?','snake-room-perfect-rng-655'
|
||||
'52','?','sewer-key-chest-risky-1212'
|
||||
'53','?','sewer-key-chest-rta-1215'
|
||||
'54','?','sewer1-706'
|
||||
'55','?','sewer1-707'
|
||||
'56','?','sewer2-608'
|
||||
'57','?','keyrat-840'
|
||||
'58','?','rat-hallway-827'
|
||||
'59','?','behind-sanc-705'
|
||||
'60','?','behind-sanc-rta-719'
|
||||
'61','?','behind-sanc2-720'
|
||||
'62','?','?'
|
||||
'63','?','sanc-2946'
|
||||
'64','?','sanc-heart-3303'
|
||||
'65','?','sanc-heart-chestturn-3305'
|
||||
'66','?','outside-sanc-807'
|
||||
'67','?','graveyard-646'
|
||||
'68','?','east-path-403'
|
||||
'69','?','wooden-bridge-906'
|
||||
'70','?','octofield-724'
|
||||
'71','?','guard-bridge-311'
|
||||
'72','?','east-fairy-cave-right-exit-326'
|
||||
'73','?','outside-eastern-2540'
|
||||
'74','?','entrance-504'
|
||||
'75','?','three-popos-434'
|
||||
'76','?','cannonballs-859'
|
||||
'77','?','bigchest-upper-leftpot-736'
|
||||
'78','?','westwing-upper-455'
|
||||
'79','?','stalfos-spawn-617'
|
||||
'80','?','compass-room-615'
|
||||
'81','?','westwing-lower1-335'
|
||||
'82','?','bigchest-lower1-arrows-805'
|
||||
'83','?','bigchest-lower1-noarrows-704'
|
||||
'84','?','east-wing-645'
|
||||
'85','?','dark-af-boom-623'
|
||||
'86','?','dark-af-sword-630'
|
||||
'87','?','dark-potkey-diagboom-656'
|
||||
'88','?','dark-potkey-walk-658'
|
||||
'89','?','dark-af2-607'
|
||||
'90','?','cannonballs-upper-851'
|
||||
'91','?','bigkey-1105'
|
||||
'92','?','westwing-lower2-756'
|
||||
'93','?','bigchest-bow-1452'
|
||||
'94','?','gwg-noslash-menu-913'
|
||||
'95','?','afpots-802'
|
||||
'96','?','eyegore-floor-switch-519'
|
||||
'97','?','eyegore-floor-switch-pumpless-522'
|
||||
'98','?','cannonball-switch-503'
|
||||
'99','?','cannonball-switch-pumpless-507'
|
||||
'100','?','zgr-601'
|
||||
'101','?','double-red-eyegores-617'
|
||||
'102','?','armos-topright-1321'
|
||||
'103','?','outside-eastern-1322'
|
||||
'104','?','saha-walkout-1951-449-8'
|
||||
'105','?','outside-eastern2-1301-99-0'
|
||||
'106','?','east-fairy-cave-253'
|
||||
'107','?','guard-bridge-601-35-0'
|
||||
'108','?','links-yard-354-32-0'
|
||||
'109','?','annoying-bushes-403'
|
||||
'110','?','west-of-swamp1-356'
|
||||
'111','?','south-of-grove1-right-exit-452-32-0'
|
||||
'112','?','grove-westside1-nocharge-255'
|
||||
'113','?','grove-westside1-swordcharge-308'
|
||||
'114','?','outside-library1-dashes-708'
|
||||
'115','?','outside-library1-spindash-626'
|
||||
'116','?','library-1038-127-0'
|
||||
'117','?','outside-library2-noss-751-99-0'
|
||||
'118','?','outside-library2-spindash-707'
|
||||
'119','?','grove-westside2-leftexit-233-36'
|
||||
'120','?','grove-westside2-rta-243-36'
|
||||
'121','?','south-of-grove2-fromleft-belowbush-458-32'
|
||||
'122','?','south-of-grove2-fromleft-bushdash-455-32'
|
||||
'123','?','south-of-grove2-fromright-bushdash-447-32'
|
||||
'124','?','west-of-swamp2-frombelow-350'
|
||||
'125','?','west-of-swamp2-frombushes-346'
|
||||
'126','?','west-of-swamp2-fromlowbushes-346'
|
||||
'127','?','west-of-swamp2-fromlowbushes-farleftexit-346'
|
||||
'128','?','annoying-bushes2-352-33'
|
||||
'129','?','links-yard-339-32'
|
||||
'130','?','links-yard-earlydash-336-32'
|
||||
'131','?','waterdash-menu-629-35-1'
|
||||
'132','?','waterdash-nomenu-524-37-0'
|
||||
'133','?','east-of-watergate-216-35'
|
||||
'134','?','watergate-552-37'
|
||||
'135','?','middle-aged-man-643-31'
|
||||
'136','?','outside-desert-2250-175'
|
||||
'137','?','desert1-risky-726-97'
|
||||
'138','?','desert1-rta-730-98'
|
||||
'139','?','north-hall1-leftpoke-510-21'
|
||||
'140','?','north-hall1-rtapoke-512-21'
|
||||
'141','?','nw-room1-258-19'
|
||||
'142','?','torchkey-rta-614'
|
||||
'143','?','torchkey-underleft-614'
|
||||
'144','?','nw-room2-235'
|
||||
'145','?','north-hall2-412-21'
|
||||
'146','?','ne-room1-351'
|
||||
'147','?','east-wing1-416-21'
|
||||
'148','?','compass-room1-519'
|
||||
'149','?','bigkey-chestturn-758-49'
|
||||
'150','?','bigkey-rta-goodrng-803'
|
||||
'151','?','compass-room2-405'
|
||||
'152','?','compass-room2-pumpless-407'
|
||||
'153','?','east-wing2-318'
|
||||
'154','?','east-wing2-pumpless-319'
|
||||
'155','?','ne-room2-418-20'
|
||||
'156','?','north-hall3-412-21'
|
||||
'157','?','nw-room3-346-18'
|
||||
'158','?','cop1-528'
|
||||
'159','?','bigchest-606-29-1'
|
||||
'160','?','cop2-355'
|
||||
'161','?','nw-room4-dashes-348'
|
||||
'162','?','nw-room4-walk-rta-349'
|
||||
'163','?','west-wing-451-21'
|
||||
'164','?','d1-exit-324'
|
||||
'165','?','outside-desert-noss-709-102'
|
||||
'166','?','outside-desert-spindash-732-102-3'
|
||||
'167','?','d2-entrance-528-96'
|
||||
'168','?','d2-entrance-pumpless-532-97'
|
||||
'169','?','tile-room1-458'
|
||||
'170','?','bridge-539-58'
|
||||
'171','?','popos-546'
|
||||
'172','?','beamos-hall-706-1'
|
||||
'173','?','beamos-hall-rta-720'
|
||||
'174','?','tile-room2-517-21'
|
||||
'175','?','torches-nomenu-1549-0-0'
|
||||
'176','?','torches-rta-1656-0-4'
|
||||
'177','?','lanmos-2cyc-1953'
|
||||
'178','?','lanmos-2cyc-2059'
|
||||
'179','?','outside-desert-cactusdash-1044-77-0'
|
||||
'180','?','outside-desert-geldmandash-1053-76-0'
|
||||
'181','?','outside-desert-rta-highdash-1109-76-0'
|
||||
'182','?','outside-desert-rta-lowdash-1116-76-0'
|
||||
'183','?','middle-aged-man-634-30-0'
|
||||
'184','?','watergate-458-34-0'
|
||||
'185','?','beach-445-35-0'
|
||||
'186','?','beach-rta-530-35-0'
|
||||
'187','?','fakeflips-832-36-0'
|
||||
'188','?','fakeflips-rta-808-35-0'
|
||||
'189','?','whirlpool-enter-336-36-0'
|
||||
'190','?','whirlpool-exit-806-72-0'
|
||||
'191','?','rupee-tree-picklearrow-808-35-0'
|
||||
'192','?','rupee-tree-rta-821-35-0'
|
||||
'193','?','old-man-cave-1026-134-0'
|
||||
'194','?','old-man-tunnel-2139-295-8'
|
||||
'195','?','death-mountain-lower-3039-246-009'
|
||||
'196','?','bunny-link-739'
|
||||
'197','?','death-mountain-upper-ledgehop-736-76-0'
|
||||
'198','?','death-mountain-upper-rta-748-76-0'
|
||||
'199','?','lobby1-503-101-0'
|
||||
'200','?','lobby1-pumpless-507-101-0'
|
||||
'201','?','basement-key-629-71-0'
|
||||
'202','?','lobby2-boom-859-107-007'
|
||||
'203','?','lobby2-boomdash-851-107-010'
|
||||
'204','?','lobby2-boomless-824'
|
||||
'205','?','tileroom-boomdash-4340-66-0'
|
||||
'206','?','tileroom-boomless-4326'
|
||||
'207','?','3mold-boom-menu-429-0-2'
|
||||
'208','?','3mold-boomless-538'
|
||||
'209','?','torches-812-31-008'
|
||||
'210','?','lobby3-540-107-0'
|
||||
'211','?','beetles-936-63-0'
|
||||
'212','?','bkdoor-342-0-0'
|
||||
'213','?','bkdoor-pumpless-345-0-0'
|
||||
'214','?','safety-switch-634'
|
||||
'215','?','safety-switch-pumpless-dash-639'
|
||||
'216','?','safety-switch-pumpless-walk-639'
|
||||
'217','?','bigchest-ebj-2143-95-17'
|
||||
'218','?','bigchest-waffle-rta-2324-95-20'
|
||||
'219','?','bigchest-waffle-sparkmanip-2301-95-18'
|
||||
'220','?','bumper-skip-729-66-0'
|
||||
'221','?','moldorm-2752-116-0'
|
||||
'222','?','moldorm-2858-116-0'
|
||||
'223','?','death-mountain-upper-943'
|
||||
'224','?','kak-tunnel-01-806'
|
||||
'225','?','kak-tunnel-02-607'
|
||||
'226','?','kak-tunnel-02-arrows-835'
|
||||
'227','?','kak-tunnel-02-rta-710'
|
||||
'228','?','first-rupee-tree-928'
|
||||
'229','?','first-rupee-tree-birddash-1029'
|
||||
'230','?','first-rupee-tree-rta-x4FA-exit-921'
|
||||
'231','?','lumberjacks-652'
|
||||
'232','?','lumberjacks-picklearrow-y078-enter-455'
|
||||
'233','?','lumberjacks-rta-y078-enter-701'
|
||||
'234','?','lost-woods-01-1709'
|
||||
'235','?','lost-woods-01-y078-enter-1713'
|
||||
'236','?','master-sword-3909'
|
||||
'237','?','lost-woods-02-2252'
|
||||
'238','?','lost-woods-02-rta-2243'
|
||||
'239','?','fortune-teller-hut-rta-619'
|
||||
'240','?','whirlpool-pond-348'
|
||||
'241','?','wsb-543'
|
||||
'242','?','outside-hyrule-castle-1000'
|
||||
'243','?','castle-lobby-abovetorch-531'
|
||||
'244','?','castle-lobby-rta-540'
|
||||
'245','?','sw-room-455-bad-recording'
|
||||
'246','?','sw-room-456'
|
||||
'247','?','ramparts-617'
|
||||
'248','?','entrance-334'
|
||||
'249','?','goldknights-pui-734'
|
||||
'250','?','prizepack-guards-703'
|
||||
'251','?','first-dark-room-605'
|
||||
'252','?','first-dark-room-rta-619'
|
||||
'253','?','despair-1617-44'
|
||||
'254','?','last-3f-dark-room-436'
|
||||
'255','?','first-4f-dark-room-625'
|
||||
'256','?','first-4f-dark-room-pumpless-628'
|
||||
'257','?','melancholy-rta-715'
|
||||
'258','?','archerkey-beams-keydash-534'
|
||||
'259','?','archerkey-beams-rta-558'
|
||||
'260','?','redspearguards-809'
|
||||
'261','?','alert-guards-arrowkill-516'
|
||||
'262','?','alert-guards-beamkill-528'
|
||||
'263','?','cop-menu-638'
|
||||
'264','?','neopolitan-room-325'
|
||||
'265','?','statue-room-646'
|
||||
'266','?','catwalk-boom-624'
|
||||
'267','?','catwalk-boomless-621-bad-recording'
|
||||
'268','?','7f-hallway-521'
|
||||
'269','?','agah-cutscene-2451'
|
||||
'270','?','agah-0bb-4451'
|
||||
'271','?','pyramid-1043'
|
||||
'272','?','dark-octo-319'
|
||||
'273','?','hammer-bridge-444'
|
||||
'274','?','dark-east-fairy-cave-250'
|
||||
'275','?','outside-4157'
|
||||
'276','?','entrance1-dash-554'
|
||||
'277','?','entrance1-walk-556'
|
||||
'278','?','west-bomb-pickup-336'
|
||||
'279','?','shooter-key-847'
|
||||
'280','?','entrance2-333'
|
||||
'281','?','bomb-pickup1-428'
|
||||
'282','?','junction1-ledgehop-524'
|
||||
'283','?','junction1-slashjelly-556'
|
||||
'284','?','turtle-key-619'
|
||||
'285','?','entrance3-333'
|
||||
'286','?','bomb-pickup2-412'
|
||||
'287','?','junction2-907'
|
||||
'288','?','junction2-badrng-917'
|
||||
'289','?','upper-turtle-key-715'
|
||||
'290','?','bigkey-leftside-754'
|
||||
'291','?','entrance4-333'
|
||||
'292','?','bomb-pickup3-412'
|
||||
'293','?','junction3-651'
|
||||
'294','?','beetle-room1-954'
|
||||
'295','?','beetle-room1-dash2chest-1002'
|
||||
'296','?','beetle-room1-rta-1012'
|
||||
'297','?','hammeryump-1bombpickup-1324'
|
||||
'298','?','hammeryump-2bombpickup-1348'
|
||||
'299','?','darkmaze-738'
|
||||
'300','?','entrance5-333'
|
||||
'301','?','bomb-pickup4-412'
|
||||
'302','?','junction4-651'
|
||||
'303','?','beetle-room2-dash-and-hop-644'
|
||||
'304','?','beetle-room2-rta-walk-702'
|
||||
'305','?','beetle-room2-walk-and-hop-657'
|
||||
'306','?','sexy-statue-1333'
|
||||
'307','?','ugly-statue-1406'
|
||||
'308','?','mimics-454'
|
||||
'309','?','eye-statue-dashes-2454'
|
||||
'310','?','eye-statue-walk-rta-2456'
|
||||
'311','?','darkpegs-607'
|
||||
'312','?','lonely-turtle-457'
|
||||
'313','?','turtle-party-701-cropped'
|
||||
'314','?','turtle-party-701'
|
||||
'315','?','turtle-party-809'
|
||||
'316','?','warp-tile-512'
|
||||
'317','?','turtle-hallway-dash-and-keydash-709'
|
||||
'318','?','turtle-hallway-rta-walk-and-slash-745'
|
||||
'319','?','turtle-hallway-walk-and-keydash-720'
|
||||
'320','?','helma-2739'
|
||||
'321','?','helma-2813'
|
||||
'322','?','helma-2830'
|
||||
'323','?','helma-2843'
|
||||
'324','?','helma-2927'
|
||||
'325','?','outside-pod-2627'
|
||||
'326','?','dark-east-fairy-cave-259'
|
||||
'327','?','pegbridge-earlydash-639'
|
||||
'328','?','pegbridge-safedash-646'
|
||||
'329','?','bombshop-359'
|
||||
'330','?','annoying-bushes-402'
|
||||
'331','?','annoying-bushes-rightcancel-402'
|
||||
'332','?','southeast-of-fluteboy-dash-334'
|
||||
'333','?','southeast-of-fluteboy-walk-rta-328'
|
||||
'334','?','south-of-fluteboy-458'
|
||||
'335','?','south-of-fluteboy-walk-rta-508'
|
||||
'336','?','fluteboy-rta-1503'
|
||||
'337','?','grove-rta-1840'
|
||||
'338','?','south-of-grove-445'
|
||||
'339','?','grove-westside-236'
|
||||
'340','?','usain-bolt-720'
|
||||
'341','?','kak-village-centerdash-3335'
|
||||
'342','?','kak-village-leftdash-3335'
|
||||
'343','?','three-musketeers-3xdash-557'
|
||||
'344','?','lost-woods-830'
|
||||
'345','?','warp-rock-705'
|
||||
'346','?','warp-rock-no-hammerdash-724'
|
||||
'347','?','north-of-outcast-748'
|
||||
'348','?','voo-943'
|
||||
'349','?','sw-quad-badrng-745'
|
||||
'350','?','sw-quad-goodrng-736'
|
||||
'351','?','nw-quad-333'
|
||||
'352','?','ne-quad-badrng-350'
|
||||
'353','?','ne-quad-goodrng-337'
|
||||
'354','?','se-quad1-551'
|
||||
'355','?','bigkey-610'
|
||||
'356','?','se-quad2-628'
|
||||
'357','?','ne-quad2-733'
|
||||
'358','?','stalfos-hallway-hammer-755'
|
||||
'359','?','stalfos-hallway-pickup-754'
|
||||
'360','?','snek-and-zazaks-335'
|
||||
'361','?','conveyor-gibos-north-352'
|
||||
'362','?','conveyor-gibos-north-353'
|
||||
'363','?','hellway-429'
|
||||
'364','?','spikeroom1-hammer-515'
|
||||
'365','?','spikeroom1-mikestrat-502'
|
||||
'366','?','attic-pot-switch1-badrng-828'
|
||||
'367','?','attic-pot-switch1-goodrng-pickup-750'
|
||||
'368','?','grasshopper-hall1-1-252'
|
||||
'369','?','grasshopper-hall2-1-308'
|
||||
'370','?','attic-window-slashgrass-556'
|
||||
'371','?','grasshopper-hall2-2-240'
|
||||
'372','?','grasshopper-hall1-2-307'
|
||||
'373','?','attic-pot-switch2-306'
|
||||
'374','?','spikeroom2-606'
|
||||
'375','?','hellway2-322'
|
||||
'376','?','zazaks-and-gibos-543'
|
||||
'377','?','zazaks-and-gibos-545'
|
||||
'378','?','conveyor-toilet-bomb-404'
|
||||
'379','?','conveyor-toilet-nobomb-321'
|
||||
'380','?','bigblock-837'
|
||||
'381','?','lonely-zazak-315'
|
||||
'382','?','prison-dashes-1053'
|
||||
'383','?','prison-walk-1106'
|
||||
'384','?','prison-walk-oneslash-1124'
|
||||
'385','?','lonely-zazak2-252'
|
||||
'386','?','conveyor-jellies1-328'
|
||||
'387','?','bigchest-606'
|
||||
'388','?','conveyor-jellies2-509'
|
||||
'389','?','bigblock2-arrows-412'
|
||||
'390','?','bigblock2-noarrows-345'
|
||||
'391','?','conveyor-toilet2-dash-hammer-736'
|
||||
'392','?','conveyor-toilet2-hammerdash-726'
|
||||
'393','?','conveyor-toilet2-rta-751'
|
||||
'394','?','stalfos-hallway2-324'
|
||||
'395','?','blind-beams-2701'
|
||||
'396','?','blind-beams-walkin-2707'
|
||||
'397','?','voo1-902'
|
||||
'398','?','voo1-rta-914'
|
||||
'399','?','300-hut-721'
|
||||
'400','?','300-hut-rta-720'
|
||||
'401','?','voo2-dash-628'
|
||||
'402','?','voo2-walk-630'
|
||||
'403','?','cursed-dwarf-justpressa-1210'
|
||||
'404','?','cursed-dwarf-rta-1224'
|
||||
'405','?','voo3-339'
|
||||
'406','?','hammerpegs1-820'
|
||||
'407','?','outside-smiths1-350'
|
||||
'408','?','smiths1-708'
|
||||
'409','?','outside-smiths2-237'
|
||||
'410','?','smiths2-910'
|
||||
'411','?','outside-smiths3-239'
|
||||
'412','?','hammerpegs2-342'
|
||||
'413','?','outside-smiths4-338'
|
||||
'414','?','smiths3-746'
|
||||
'415','?','outside-smiths5-236'
|
||||
'416','?','hammerpegs3-849'
|
||||
'417','?','voo4-fencedash-441'
|
||||
'418','?','c-shaped-house-918'
|
||||
'419','?','voo5-709'
|
||||
'420','?','moblins-badrng-524'
|
||||
'421','?','moblins-goodrng-518'
|
||||
'422','?','skeleton-forest1-1216'
|
||||
'423','?','mummy-statue-1220'
|
||||
'424','?','bigkey-badrng-659'
|
||||
'425','?','bigkey-leftside-620'
|
||||
'426','?','bigkey-rightside-635'
|
||||
'427','?','mumm-statue-exit-232'
|
||||
'428','?','skeleton-forest2-949'
|
||||
'429','?','bigchest-earlybj-1259'
|
||||
'430','?','bigchest-rta-bonk-1407'
|
||||
'431','?','bigchest-rta-bonkless-1406'
|
||||
'432','?','skeleton-forest3-933'
|
||||
'433','?','mummy-statue-passthru-427'
|
||||
'434','?','bumper-hallway-305'
|
||||
'435','?','potkey-654'
|
||||
'436','?','skeleton-forest4-738'
|
||||
'437','?','skeleton-forest4-rta-740'
|
||||
'438','?','firesnake-keydash-522'
|
||||
'439','?','potpit-left-442'
|
||||
'440','?','potpit-right-438'
|
||||
'441','?','mummy-hellway-744'
|
||||
'442','?','mummy-hellway-joestrat-812'
|
||||
'443','?','vineroom-badrng-415'
|
||||
'444','?','vineroom-goodrng-359'
|
||||
'445','?','mummy-key-629'
|
||||
'446','?','mummy-key-rta-633'
|
||||
'447','?','mothhole-top-422'
|
||||
'448','?','mothula-1118'
|
||||
'449','?','mothula-1122'
|
||||
'450','?','outside-skull-menu-352'
|
||||
'451','?','lost-woods-dash-758'
|
||||
'452','?','lost-woods-walk-806'
|
||||
'453','?','links-house-632'
|
||||
'454','?','castle-gate-menu-rta-qw-637'
|
||||
'455','?','castle-gate-menu-walk-qw-639'
|
||||
'456','?','castle-gate-walk-qw-534'
|
||||
'457','?','pyramid-659'
|
||||
'458','?','dark-octofield-236'
|
||||
'459','?','broken-bridge-738'
|
||||
'460','?','lonely-ropa-243'
|
||||
'461','?','ropa-lottery-910'
|
||||
'462','?','dark-cuckoos-leftgrab-737'
|
||||
'463','?','dark-cuckoos-rta-746'
|
||||
'464','?','quake-1925'
|
||||
'465','?','quake-earlythrow-1858'
|
||||
'466','?','whirlpool1-dashcancel-605'
|
||||
'467','?','whirlpool1-nocancel-603'
|
||||
'468','?','zoras-domain-dashout-5934'
|
||||
'469','?','zoras-domain-walkout-5933'
|
||||
'470','?','tiny-warp-dik-605'
|
||||
'471','?','ice-warp-833'
|
||||
'472','?','ice-island-358'
|
||||
'473','?','ice-entrance-438'
|
||||
'474','?','ice2-508'
|
||||
'475','?','floor-switch-910'
|
||||
'476','?','block-intersection1-358'
|
||||
'477','?','compass-room-144'
|
||||
'478','?','block-intersection2-456'
|
||||
'479','?','penguins1-spin-535'
|
||||
'480','?','penguins1-tmstrat-523'
|
||||
'481','?','block-intersection3-512'
|
||||
'482','?','bombable-floor-dboost-916'
|
||||
'483','?','bombable-floor-nodboost-944'
|
||||
'484','?','bombable-floor-rta-good-rng-957'
|
||||
'485','?','big-stalfos-819'
|
||||
'486','?','conveyor-hellway-709'
|
||||
'487','?','ipbj-1209'
|
||||
'488','?','floor-zols-300'
|
||||
'489','?','penguins2-804'
|
||||
'490','?','big-spike-405'
|
||||
'491','?','lonely-firebar-419'
|
||||
'492','?','lonely-firebar-dash-451'
|
||||
'493','?','double-freezor-503'
|
||||
'494','?','big-chest-401'
|
||||
'495','?','big-pit-351'
|
||||
'496','?','block-push-hammerpot-badlag-542'
|
||||
'497','?','block-push-potpickup-badlag-539'
|
||||
'498','?','statue-room-hammer-both-pots-1323'
|
||||
'499','?','statue-room-hammer-one-pot-1306'
|
||||
'500','?','statue-room-pickup-both-pots-1318'
|
||||
'501','?','statue-room-pickup-one-pot-1304'
|
||||
'502','?','kholdstare-1poke-1621'
|
||||
'503','?','kholdstare-2poke-1559'
|
||||
'504','?','kholdstare-2poke-1602'
|
||||
'505','?','kholdstare-6slash-1655'
|
||||
'506','?','ice-island-343'
|
||||
'507','?','lake-hylia-birddash-803'
|
||||
'508','?','lake-hylia-walk-812'
|
||||
'509','?','links-house-521'
|
||||
'510','?','grassy-area-menu-437'
|
||||
'511','?','warp-nokill-422'
|
||||
'512','?','warp-octokill-437'
|
||||
'513','?','postwarp-hammerdash-950'
|
||||
'514','?','postwarp-walk-959'
|
||||
'515','?','outside-swamp1-noqw-629'
|
||||
'516','?','outside-swamp1-qw-617'
|
||||
'517','?','outside-watergate-noqw-427'
|
||||
'518','?','outside-watergate-qw-407'
|
||||
'519','?','watergate-entrance-mirrordash-455'
|
||||
'520','?','watergate-entrance-walk-500'
|
||||
'521','?','afskip-715'
|
||||
'522','?','afskip-bonk-736'
|
||||
'523','?','afskip-rta-732'
|
||||
'524','?','watergate-entrance2-317'
|
||||
'525','?','outside-watergate2-closewarp-236'
|
||||
'526','?','outside-watergate2-qw-413'
|
||||
'527','?','outside-swamp2-closewarp-424'
|
||||
'528','?','outside-swamp2-qw-352'
|
||||
'529','?','dungeon-entrance-1017'
|
||||
'530','?','potkey1-menu-1050'
|
||||
'531','?','potkey1-nomenu-923'
|
||||
'532','?','pool1-empty-627'
|
||||
'533','?','potkey2-dash-336'
|
||||
'534','?','potkey2-walk-339'
|
||||
'535','?','pool1-empty2-dash-515'
|
||||
'536','?','pool1-empty2-walk-514'
|
||||
'537','?','waterlever1-1232'
|
||||
'538','?','pool1-full-542'
|
||||
'539','?','bigchest1-839'
|
||||
'540','?','pool2-empty-710'
|
||||
'541','?','potkey3-dash-336'
|
||||
'542','?','potkey3-walk-339'
|
||||
'543','?','pool2-empty2-554'
|
||||
'544','?','bigchest2-759'
|
||||
'545','?','waterlever2-1355'
|
||||
'546','?','bigchest3-844'
|
||||
'547','?','pool2-full1-hammerdash-920'
|
||||
'548','?','pool2-full1-rta-939'
|
||||
'549','?','jelly-dash-1015'
|
||||
'550','?','sociable-firebar-1030'
|
||||
'551','?','jellydash-northside-433'
|
||||
'552','?','bigkey-719'
|
||||
'553','?','jelly-dash2-928'
|
||||
'554','?','pool2-full2-dboost-907'
|
||||
'555','?','pool2-full2-hammerdash-925'
|
||||
'556','?','pool2-full2-rta-936'
|
||||
'557','?','bigchest4-2026'
|
||||
'558','?','bigchest4-rta-2112'
|
||||
'559','?','statue-room-arrows-1205'
|
||||
'560','?','statue-room-no-arrows-1127'
|
||||
'561','?','red-jelly-2slash-351'
|
||||
'562','?','red-jelly-beam-340'
|
||||
'563','?','red-jelly-dash-326'
|
||||
'564','?','water-lever3-1146'
|
||||
'565','?','smallhall-313'
|
||||
'566','?','waterfall-room-509'
|
||||
'567','?','restock-all-448'
|
||||
'568','?','restock-arrows-only-422'
|
||||
'569','?','restock-bomb-only-420'
|
||||
'570','?','restock-skip-dash-330'
|
||||
'571','?','restock-skip-walk-334'
|
||||
'572','?','c-room-602'
|
||||
'573','?','phelps-way-943'
|
||||
'574','?','t-room-234'
|
||||
'575','?','arrghus-frqk-1737'
|
||||
'576','?','arrghus-frqk-1745'
|
||||
'577','?','arrghus-frqk-1748'
|
||||
'578','?','arrghus-noqk-1902'
|
||||
'579','?','arrghus-noqk-1930'
|
||||
'580','?','outside-swamp-357'
|
||||
'581','?','outside-swamp-from-fr-341'
|
||||
'582','?','outside-swamp-from-fr-with-qw-348'
|
||||
'583','?','outside-swamp-from-mirror-qw-236'
|
||||
'584','?','outside-watergate-852'
|
||||
'585','?','outside-watergate-from-qw-836'
|
||||
'586','?','dm-both-swordclimbs-2145'
|
||||
'587','?','dm-hookspeed-noswordclimbs-2202'
|
||||
'588','?','dm-hybrid-2205'
|
||||
'589','?','dm-spindash-2123'
|
||||
'590','?','dm-spindash-2134'
|
||||
'591','?','dm-spindash-dmgcancel-2111'
|
||||
'592','?','dark-dm-534'
|
||||
'593','?','ether-dashoff-2305'
|
||||
'594','?','ether-quickhop-2243'
|
||||
'595','?','octoballoon-610'
|
||||
'596','?','icerod-entrance-931'
|
||||
'597','?','icerod1-334'
|
||||
'598','?','icerodchest-nomenu-659'
|
||||
'599','?','icerodchest-rta-menu-815'
|
||||
'600','?','icerod2-menu-350'
|
||||
'601','?','icerod2-rta-nomenu-233'
|
||||
'602','?','icerod-leaving-547'
|
||||
'603','?','icerod-leaving-rta-556'
|
||||
'604','?','mirewarp-menu-701'
|
||||
'605','?','mire-entrance-nomenu-2501'
|
||||
'606','?','mire01-821'
|
||||
'607','?','mire02-1031'
|
||||
'608','?','mainhub1-toproute-947'
|
||||
'609','?','poporoom1-337'
|
||||
'610','?','spikekey1-351'
|
||||
'611','?','poporoom2-337'
|
||||
'612','?','beatthefireball-938'
|
||||
'613','?','jellykey-449'
|
||||
'614','?','tileroom-321'
|
||||
'615','?','bombslugs-508'
|
||||
'616','?','torches1-752'
|
||||
'617','?','torches2-rta-2127'
|
||||
'618','?','torches2-toplighting-2121'
|
||||
'619','?','bighole-322'
|
||||
'620','?','bigkey-621'
|
||||
'621','?','warptile-230'
|
||||
'622','?','wizzroom-412'
|
||||
'623','?','bigspike-318'
|
||||
'624','?','lonelystalfos-337'
|
||||
'625','?','sparkgamble-bestboost-1106'
|
||||
'626','?','sparkgamble-damageless-1144'
|
||||
'627','?','sparkgamble-rta-menu-1236'
|
||||
'628','?','sparkgamble-snekblock-1205'
|
||||
'629','?','maproom-south-327'
|
||||
'630','?','maproom-south-rta-327'
|
||||
'631','?','bigchest-menu-1012'
|
||||
'632','?','bigchest-nomenu-852'
|
||||
'633','?','maproom-north-328'
|
||||
'634','?','spikeykey2-rta-walk-702'
|
||||
'635','?','spikeykey2-rta-walk-magicgrab-753'
|
||||
'636','?','spikeykey2-rta-walk-magicgrab-with-hook-752'
|
||||
'637','?','jadinledge-hookdash-333'
|
||||
'638','?','jadinledge-quickhop-328'
|
||||
'639','?','jadinledge-rta-2dash-332'
|
||||
'640','?','wizzpot-rta-hook-610'
|
||||
'641','?','wizzpot-topdash-558'
|
||||
'642','?','bridge-504'
|
||||
'643','?','caneblockswitch-old-928'
|
||||
'644','?','caneblockswitch-spooky-934'
|
||||
'645','?','bigblock-429'
|
||||
'646','?','caneswitch-spooky-1132'
|
||||
'647','?','caneswitch-spooky-roddash-bonk-1108'
|
||||
'648','?','bombwall-spooky-dashout-513'
|
||||
'649','?','bombwall-spooky-dashout-risky-var-443'
|
||||
'650','?','bombwall-spooky-walk-534'
|
||||
'651','?','badfarmroom-spooky-dash-above-612'
|
||||
'652','?','badfarmroom-spooky-dash-below-608'
|
||||
'653','?','badfarmroom-spooky-riskier-walk-619'
|
||||
'654','?','badfarmroom-spooky-rta-walk-624'
|
||||
'655','?','firesnek-skip-menu-956'
|
||||
'656','?','firesnek-skip-rta-nomenu-909'
|
||||
'657','?','firesnek-skip-rta-nomenu-915'
|
||||
'658','?','vitty-nomenu-1732'
|
||||
'659','?','vitty-rta-menu-1846'
|
||||
'660','?','?'
|
||||
'661','?','outside-mire-335'
|
||||
'662','?','outside-desert-818'
|
||||
'663','?','wafflehouse-drivethru-1241'
|
||||
'664','?','wafflehouse-drivethru-nostairclimb-1243'
|
||||
'665','?','broken-bridge-1034'
|
||||
'666','?','broken-bridge-fromfacingup-1037'
|
||||
'667','?','paradox-lower-454'
|
||||
'668','?','paradox-upper-740'
|
||||
'669','?','run-killing-deadrocks-525'
|
||||
'670','?','hammerpegs-1251'
|
||||
'671','?','outside-trock-2057'
|
||||
'672','?','outside-trock-rta-1957'
|
||||
'673','?','dungeon-entrance-menu-933'
|
||||
'674','?','dungeon-entrance-no-menu-818'
|
||||
'675','?','largepit1-928'
|
||||
'676','?','torches-1428'
|
||||
'677','?','torches-rta-1432'
|
||||
'678','?','rollerroom-1038'
|
||||
'679','?','rollerroom-topdmg-1032'
|
||||
'680','?','torches-backtrack-346'
|
||||
'681','?','largepit2-1025'
|
||||
'682','?','pokey0-526'
|
||||
'683','?','pokey0-rta-551'
|
||||
'684','?','chomps-2blocks-805'
|
||||
'685','?','chomps-bbb-758'
|
||||
'686','?','chomps-blocknbeam-748'
|
||||
'687','?','tunnels-arrows-2040'
|
||||
'688','?','tunnels-no-arrows-1948'
|
||||
'689','?','lava-room1-739'
|
||||
'690','?','pokey1-bl-keydash-849'
|
||||
'691','?','bigkey-fromdash-1245'
|
||||
'692','?','bigkey-fromwalk-1241'
|
||||
'693','?','pokey1-backtrack-beamless-644'
|
||||
'694','?','pokey1-backtrack-beams-632'
|
||||
'695','?','pokey1-backtrack-canedash-624'
|
||||
'696','?','lava-room3-1247'
|
||||
'697','?','double-pokeys-429'
|
||||
'698','?','miniroller-2dash-339'
|
||||
'699','?','lavaroom4-619'
|
||||
'700','?','walldash-414'
|
||||
'701','?','crystalroller-beams-812'
|
||||
'702','?','darkroom-2428'
|
||||
'703','?','helmadash1-623'
|
||||
'704','?','laserskip-block-921'
|
||||
'705','?','laserskip-dash-823'
|
||||
'706','?','helmadash2-414'
|
||||
'707','?','helmadash2-rta-417'
|
||||
'708','?','canedash-725[30lf]'
|
||||
'709','?','canedash-725[31lf]'
|
||||
'710','?','canedash-magicless-814'
|
||||
'711','?','canedash-rta-walk-823'
|
||||
'712','?','restock-graball-1238'
|
||||
'713','?','restock-magicgrab-1232'
|
||||
'714','?','restock-skipall-1145'
|
||||
'715','?','trinexx-rta-3759'
|
||||
'716','?','outside-trock-454'
|
||||
'717','?','lynel-bridge-909'
|
||||
'718','?','entrance-2239'
|
||||
'719','?','entrance-nostairclimb-2251'
|
||||
'720','?','foyer-624'
|
||||
'721','?','torchkey-bonkandwalk-759'
|
||||
'722','?','torchkey-hook-758'
|
||||
'723','?','torchkey-nokey-606'
|
||||
'724','?','conveyor-potkey-905'
|
||||
'725','?','spikeskip-919'
|
||||
'726','?','spikeskip-noskip-937'
|
||||
'727','?','double-crystal-switch-719'
|
||||
'728','?','double-crystal-switch-rta-739'
|
||||
'729','?','double-crystal-switch-rta-740'
|
||||
'730','?','spike-and-pegs-356'
|
||||
'731','?','firesnake-room-1029'
|
||||
'732','?','firesnake-room-bonk-1117'
|
||||
'733','?','firesnake-room-framerule-1011'
|
||||
'734','?','warp-tile1-157'
|
||||
'735','?','warp-tile2-344'
|
||||
'736','?','warp-tile2-justholddown-350'
|
||||
'737','?','warp-tile3-430'
|
||||
'738','?','warp-tileskip-816'
|
||||
'739','?','warp-tileskip-with-menu-931'
|
||||
'740','?','false-floor-no-menu-1017'
|
||||
'741','?','false-floor-with-menu-1122'
|
||||
'742','?','bombable-floor-717'
|
||||
'743','?','icearmos-1529'
|
||||
'744','?','icearmos-321-1548'
|
||||
'745','?','icearmos-321-dboost-1546'
|
||||
'746','?','bk-arrows-738'
|
||||
'747','?','bk-no-arrows-606'
|
||||
'748','?','foyer2-745'
|
||||
'749','?','mj-room-1045-arrow-dash'
|
||||
'750','?','mimics1-joestrat-647'
|
||||
'751','?','mimics1-myramics-653'
|
||||
'752','?','mimics2-blunt-553'
|
||||
'753','?','mimics2-opt-519'
|
||||
'754','?','east-spike-room-302'
|
||||
'755','?','spiketrap-1341'
|
||||
'756','?','spiketrap-abovepot-1406'
|
||||
'757','?','gbz-513'
|
||||
'758','?','gbz-walk-637'
|
||||
'759','?','g1-838'
|
||||
'760','?','g2-441'
|
||||
'761','?','g3-644'
|
||||
'762','?','g4-446'
|
||||
'763','?','g5-459'
|
||||
'764','?','bunnybeamhall-305'
|
||||
'765','?','lanmo2-1141'
|
||||
'766','?','restock-248'
|
||||
'767','?','wizz1-849'
|
||||
'768','?','guardbridge-529'
|
||||
'769','?','wizz2-429'
|
||||
'770','?','foosdabridge-653'
|
||||
'771','?','foosdabridge-rightdash-703'
|
||||
'772','?','torches1-1251-magic-noroddash'
|
||||
'773','?','eyelasers-529'
|
||||
'774','?','torches2-637'
|
||||
'775','?','torches2-safewalk-647'
|
||||
'776','?','helmakey-500-dmg'
|
||||
'777','?','helmakey-507-dmgless'
|
||||
'778','?','bombwall-521'
|
||||
'779','?','bombwall-damageless-530'
|
||||
'780','?','bombwall-rta-543'
|
||||
'781','?','pegschestkey-843'
|
||||
'782','?','pegschestkey-magicskip-454'
|
||||
'783','?','pegschestkey-safe-634'
|
||||
'784','?','mold2-hover-1232'
|
||||
'785','?','mold2-hover-1301'
|
||||
'786','?','mold2-hover-1337'
|
||||
'787','?','mold2-kill-hook-1949'
|
||||
'788','?','mold2-kill-hook-1958'
|
||||
'789','?','helma-hallway-607'
|
||||
'790','?','helma-hallway-safe-620'
|
||||
'791','?','torch-hallway-635'
|
||||
'792','?','agah2-4927'
|
||||
'793','?','?'
|
||||
'794','?','?'
|
||||
'795','?','?'
|
||||
'796','?','?'
|
||||
'797','?','?'
|
||||
'798','?','ganon-139.55-nfc'
|
||||
'799','?','ganon-139.55'
|
||||
'800','?','?'
|
||||
'801','?','?'
|
||||
'802','?','?'
|
||||
'803','?','?'
|
||||
'804','?','?'
|
||||
'805','?','?'
|
||||
'806','?','?'
|
||||
'807','?','?'
|
||||
'808','?','?'
|
||||
'809','?','?'
|
||||
'810','?','?'
|
||||
'811','?','?'
|
||||
'812','?','?'
|
||||
'813','?','?'
|
||||
'814','?','?'
|
||||
'815','?','?'
|
||||
'816','?','?'
|
||||
BIN
sfx/1v2.mp3
BIN
sfx/1v2.mp3
Binary file not shown.
BIN
sfx/2+2.mp3
Normal file → Executable file
BIN
sfx/2+2.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/20gp.mp3
BIN
sfx/20gp.mp3
Binary file not shown.
BIN
sfx/ahhh.mp3
Normal file → Executable file
BIN
sfx/ahhh.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/airplane.mp3
BIN
sfx/airplane.mp3
Binary file not shown.
BIN
sfx/albert.mp3
Executable file
BIN
sfx/albert.mp3
Executable file
Binary file not shown.
BIN
sfx/alert.mp3
Executable file
BIN
sfx/alert.mp3
Executable file
Binary file not shown.
BIN
sfx/andhot.mp3
BIN
sfx/andhot.mp3
Binary file not shown.
Binary file not shown.
BIN
sfx/archery.mp3
BIN
sfx/archery.mp3
Binary file not shown.
BIN
sfx/arise.mp3
BIN
sfx/arise.mp3
Binary file not shown.
BIN
sfx/aspen.mp3
Normal file → Executable file
BIN
sfx/aspen.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/auw.mp3
BIN
sfx/auw.mp3
Binary file not shown.
BIN
sfx/aww.mp3
BIN
sfx/aww.mp3
Binary file not shown.
BIN
sfx/bananas.mp3
BIN
sfx/bananas.mp3
Binary file not shown.
BIN
sfx/bigshit.mp3
Executable file
BIN
sfx/bigshit.mp3
Executable file
Binary file not shown.
BIN
sfx/bjqueen.mp3
BIN
sfx/bjqueen.mp3
Binary file not shown.
BIN
sfx/blazeit.mp3
Normal file → Executable file
BIN
sfx/blazeit.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/bluntsmd.mp3
Executable file
BIN
sfx/bluntsmd.mp3
Executable file
Binary file not shown.
BIN
sfx/bonk.mp3
BIN
sfx/bonk.mp3
Binary file not shown.
BIN
sfx/booty.mp3
BIN
sfx/booty.mp3
Binary file not shown.
Binary file not shown.
BIN
sfx/bustin.mp3
BIN
sfx/bustin.mp3
Binary file not shown.
BIN
sfx/butt.mp3
Normal file → Executable file
BIN
sfx/butt.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/butwait.mp3
BIN
sfx/butwait.mp3
Binary file not shown.
BIN
sfx/bwaa.mp3
Normal file → Executable file
BIN
sfx/bwaa.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/bye.mp3
BIN
sfx/bye.mp3
Binary file not shown.
BIN
sfx/byeb.mp3
Executable file
BIN
sfx/byeb.mp3
Executable file
Binary file not shown.
Binary file not shown.
BIN
sfx/cd.mp3
BIN
sfx/cd.mp3
Binary file not shown.
BIN
sfx/chipotle.mp3
Normal file → Executable file
BIN
sfx/chipotle.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/chomp.mp3
Normal file → Executable file
BIN
sfx/chomp.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/choochoo.mp3
BIN
sfx/choochoo.mp3
Binary file not shown.
BIN
sfx/chrislaugh.mp3
Normal file → Executable file
BIN
sfx/chrislaugh.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/clever.mp3
Executable file
BIN
sfx/clever.mp3
Executable file
Binary file not shown.
BIN
sfx/coffee.mp3
BIN
sfx/coffee.mp3
Binary file not shown.
Binary file not shown.
BIN
sfx/cooler.mp3
BIN
sfx/cooler.mp3
Binary file not shown.
BIN
sfx/correct.mp3
Executable file
BIN
sfx/correct.mp3
Executable file
Binary file not shown.
BIN
sfx/dbio.mp3
BIN
sfx/dbio.mp3
Binary file not shown.
BIN
sfx/dead.mp3
Executable file
BIN
sfx/dead.mp3
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
sfx/diaper.mp3
BIN
sfx/diaper.mp3
Binary file not shown.
BIN
sfx/dickhole.mp3
BIN
sfx/dickhole.mp3
Binary file not shown.
BIN
sfx/digup.mp3
Executable file
BIN
sfx/digup.mp3
Executable file
Binary file not shown.
BIN
sfx/dinodna.mp3
Executable file
BIN
sfx/dinodna.mp3
Executable file
Binary file not shown.
BIN
sfx/disagree.mp3
BIN
sfx/disagree.mp3
Binary file not shown.
BIN
sfx/dode.mp3
Normal file → Executable file
BIN
sfx/dode.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/dodson.mp3
Executable file
BIN
sfx/dodson.mp3
Executable file
Binary file not shown.
Binary file not shown.
BIN
sfx/door.mp3
BIN
sfx/door.mp3
Binary file not shown.
BIN
sfx/drinkfull.mp3
Executable file
BIN
sfx/drinkfull.mp3
Executable file
Binary file not shown.
BIN
sfx/duck.mp3
BIN
sfx/duck.mp3
Binary file not shown.
BIN
sfx/duckscream.mp3
Executable file
BIN
sfx/duckscream.mp3
Executable file
Binary file not shown.
BIN
sfx/eheh.mp3
BIN
sfx/eheh.mp3
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
sfx/emmapos.mp3
BIN
sfx/emmapos.mp3
Binary file not shown.
BIN
sfx/english.mp3
BIN
sfx/english.mp3
Binary file not shown.
BIN
sfx/enjoy.mp3
BIN
sfx/enjoy.mp3
Binary file not shown.
BIN
sfx/esp.mp3
BIN
sfx/esp.mp3
Binary file not shown.
BIN
sfx/ez.mp3
BIN
sfx/ez.mp3
Binary file not shown.
BIN
sfx/fakehands.mp3
Executable file
BIN
sfx/fakehands.mp3
Executable file
Binary file not shown.
BIN
sfx/fbrage.mp3
BIN
sfx/fbrage.mp3
Binary file not shown.
BIN
sfx/fdup.mp3
Normal file → Executable file
BIN
sfx/fdup.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/fencedash.mp3
Normal file → Executable file
BIN
sfx/fencedash.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/ffob.mp3
BIN
sfx/ffob.mp3
Binary file not shown.
BIN
sfx/fine.mp3
BIN
sfx/fine.mp3
Binary file not shown.
BIN
sfx/fk.mp3
Normal file → Executable file
BIN
sfx/fk.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/flippers.mp3
BIN
sfx/flippers.mp3
Binary file not shown.
BIN
sfx/fu.mp3
BIN
sfx/fu.mp3
Binary file not shown.
BIN
sfx/funnyhow.mp3
Executable file
BIN
sfx/funnyhow.mp3
Executable file
Binary file not shown.
BIN
sfx/gameover.mp3
BIN
sfx/gameover.mp3
Binary file not shown.
BIN
sfx/gatekeepah.mp3
Normal file → Executable file
BIN
sfx/gatekeepah.mp3
Normal file → Executable file
Binary file not shown.
BIN
sfx/gcn.mp3
Executable file
BIN
sfx/gcn.mp3
Executable file
Binary file not shown.
BIN
sfx/gg.mp3
BIN
sfx/gg.mp3
Binary file not shown.
BIN
sfx/gordon.mp3
Executable file
BIN
sfx/gordon.mp3
Executable file
Binary file not shown.
BIN
sfx/gordon2.mp3
Executable file
BIN
sfx/gordon2.mp3
Executable file
Binary file not shown.
BIN
sfx/gordon3.mp3
Executable file
BIN
sfx/gordon3.mp3
Executable file
Binary file not shown.
BIN
sfx/gordon4.mp3
Executable file
BIN
sfx/gordon4.mp3
Executable file
Binary file not shown.
BIN
sfx/gotalight.mp3
Executable file
BIN
sfx/gotalight.mp3
Executable file
Binary file not shown.
BIN
sfx/gotchya.mp3
BIN
sfx/gotchya.mp3
Binary file not shown.
BIN
sfx/gottem.mp3
BIN
sfx/gottem.mp3
Binary file not shown.
BIN
sfx/groovy.mp3
BIN
sfx/groovy.mp3
Binary file not shown.
BIN
sfx/gross.mp3
BIN
sfx/gross.mp3
Binary file not shown.
BIN
sfx/gtt.mp3
BIN
sfx/gtt.mp3
Binary file not shown.
BIN
sfx/gum.mp3
Executable file
BIN
sfx/gum.mp3
Executable file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user