added audio album generation
This commit is contained in:
parent
796652028f
commit
d37a7e59e7
110
village.js
110
village.js
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue