added audio album generation

This commit is contained in:
lee2sman 2021-04-08 03:02:14 -04:00
parent 796652028f
commit d37a7e59e7
1 changed files with 102 additions and 8 deletions

View File

@ -8,6 +8,12 @@ const Charlatan = require('charlatan');
const blessed = require('blessed');
const fs = require("fs");
const generator = require("project-name-generator");
const { readdirSync } = require('fs');
const Troubadour = require('troubadour');
//audio players
const troubadourLoop1 = new Troubadour('mplayer'); //or pass in sox for example
const troubadourLoop2 = new Troubadour('mplayer'); //or pass in sox for example
//save/load files
const dungeonFile = ".dungeonfile.txt";
@ -21,6 +27,7 @@ const placesFile = ".places.txt";
const terrainFile = ".terrain.txt";
const mediaFormatsFile = ".media-formats.json";
const genresFile = ".genres.json";
const musicPath = './assets/snd/';
// game vars
program = blessed.program();
@ -109,6 +116,7 @@ function checkKeys(key){
//program.write('moved right');
if (player.position.x<width-1){
player.position.x++;
stopMusic();
}
break;
case 'left': //vim key 'h' OR left-arrow
@ -116,6 +124,7 @@ function checkKeys(key){
//program.write('moved left');
if (player.position.x>0){
player.position.x--;
stopMusic();
}
break;
case 'up': //vim key 'k' or up-arrow
@ -123,6 +132,7 @@ function checkKeys(key){
//program.write('moved up');
if (player.position.y>0){
player.position.y--;
stopMusic();
}
break;
case 'down': //vim key 'j' or down-arrow
@ -130,6 +140,7 @@ function checkKeys(key){
//program.write('moved down');
if (player.position.y<height-1){
player.position.y++;
stopMusic();
}
break;
case 'p':
@ -284,6 +295,13 @@ function checkCollision() {
//check Collision with Items
for (let i = 0; i < roomItems.length; i++){
if ((player.position.x == roomItems[i].position.x) && (player.position.y == roomItems[i].position.y)){
if (typeof roomItems[i].audio !== "undefined"){ //checks whether item is music
//console.log(roomItems[i].audio);
loop1(roomItems[i].audio[0])
loop2(roomItems[i].audio[1])
}
program.setx(0)
program.down(1)
program.write(roomItems[i].name);
@ -308,7 +326,7 @@ function checkCollision() {
}
function resetScreen(){
program.setx(1);
program.setx(0);
program.clear();
}
@ -564,11 +582,16 @@ let createTracks = () => {
trackName = capitalize(trackName);
//assemble
let name = trackName + " " + choose(mediaFormats);
let nuGenre = choose([generator.generate({ words: 1}).spaced+"-", "post-", "neo-","avant-","anti-","","",""]) + lowerFirst(choose(genres));
let format = choose(mediaFormats);
let name = trackName + " " + format;
let symbol = choose(items);
let adj = ["killer","new","old","classic","nu-skool","heavy","thrilling","drugged-out","trippy","ethereal","hard","sublime","serene","airy","brilliant","beautiful","celebratory","chill","cold","serene","damaged","draining","dark","echoy","earnest","elated","elevated","erratic","ergodic","fantastic","freak","great","gleeful","iridescent","ultra","ill","crooked","light","sick","original","powerful","pretty","playful","quiet","rewarding","ripped","rave","roaring","raucous","severe","slick","superior","tortured","tinged","vanity","victorious","vicious","wicked","wailing","wizardly","wavy","max-ed out","zooted"];
let descrip = capitalize(choose(adj)) + " " + choose(genres) + " track "+ trackName + " by " + band + ".";
let descrip = capitalize(choose(adj)) + " " + nuGenre + " " + format + " " + trackName + " by " + band + ".";
let track1 = pickATrack();
let track2 = pickATrack();
roomItems.push(
{
@ -579,7 +602,8 @@ let createTracks = () => {
{
"x":Math.floor(Math.random()*width),
"y":Math.floor(Math.random()*height)
}
},
"audio":[track1,track2]
}
)
}
@ -612,15 +636,15 @@ let createPlaces = () => {
//const buildings = ['🏛️','⛺','🏚️','⛩️','🗿']
const buildings = ['⌂','⏏','☖','☗','⛫']
const placeTypes = ['Radio','Village','House','Pirate Station','Autonomous Zone','Market','Crossroads','Place','Outpost','Trading Post','Space','Place','Gallery','Floor','House','Shack','Meeting Place','Saloon','Watering Hole','Stall','Hideout','Cart','Bar','Camp','','','','Zone']
const placeTypes = ['Radio','Village','House','Pirate Station','Autonomous Zone','Market','Basement','Place','Outpost','Trading Post','Space','Place','Gallery','Floor','House','Shack','Meeting Place','Record Studio','Shop','Squat','Yard','Cart','Warehouse','Bar','Camp','Zone']
let whichBuilding = buildings[Math.floor(Math.random()*buildings.length)];
let loc = generator.generate().spaced;
let locationTitle = generator.generate().spaced;
let suffix = placeTypes[Math.floor(Math.random() * placeTypes.length)];
let typeOfPlace = placeTypes[Math.floor(Math.random() * placeTypes.length)];
let locName = capitalize(loc + ' ' + suffix);
let locName = capitalize(locationTitle) + " " + capitalize(typeOfPlace);
places.push(
{
@ -688,6 +712,13 @@ function saveMap(){
//-------------------------LOADING HELPERS------------------------------------
//
//
//
const getDirectories = source =>
readdirSync(source, { withFileTypes: true })
.filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name);
function loadAll(){
loadDungeon();
loadTerrain();
@ -731,6 +762,69 @@ let loadInventory = () => {
inventory = JSON.parse(invFile);
}
function pickATrack(){
let soundDirs = getDirectories(musicPath);
let whichDir = Math.floor(Math.random()*soundDirs.length);
let filesInDir = fs.readdirSync(musicPath+soundDirs[whichDir]).length;
let whichTrack = Math.floor(Math.random()*filesInDir);
let trackLoc = musicPath+soundDirs[whichDir]+'/'+whichTrack+'.mp3';
return trackLoc;
}
//--------------------------AUDIO HELPERS----------------------
function loop1(file){
troubadourLoop1.play(file);
troubadourLoop1.on('start', () => {
troubadourLoop1.playing = true;
// Do something here when the audio starts playing
});
troubadourLoop1.on('end', () => {
//keep playing if in loop (at location)
if (troubadourLoop1.playing){
troubadourLoop1.play(file);
}
});
}
function loop2(file){
troubadourLoop2.play(file);
troubadourLoop2.on('start', () => {
troubadourLoop2.playing = true;
});
troubadourLoop2.on('end', () => {
//keep playing if in loop (at location)
if (troubadourLoop2.playing){
troubadourLoop2.play(file);
}
});
}
function stopMusic(){
if (troubadourLoop1.playing){
troubadourLoop1.playing = false;
troubadourLoop1.stop();
}
if (troubadourLoop2.playing){
troubadourLoop2.playing = false;
troubadourLoop2.stop();
}
}
//--------------------------MAIN-------------------------------
start();