This commit is contained in:
Chipmunk 2022-11-13 01:57:04 +00:00 committed by GitHub
parent 955070600f
commit 5306c461c9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 195 additions and 0 deletions

157
util/nbs-file.js Normal file
View file

@ -0,0 +1,157 @@
function parse (buffer) {
let i = 0
let songLength = 0
let format = 0
let vanillaInstrumentCount = 0
songLength = readShort()
if (songLength === 0) {
format = readByte()
}
if (format >= 1) {
vanillaInstrumentCount = readByte()
}
if (format >= 3) {
songLength = readShort()
}
const layerCount = readShort()
const songName = readString()
const songAuthor = readString()
const songOriginalAuthor = readString()
const songDescription = readString()
const tempo = readShort()
const autoSaving = readByte()
const autoSavingDuration = readByte()
const timeSignature = readByte()
const minutesSpent = readInt()
const leftClicks = readInt()
const rightClicks = readInt()
const blocksAdded = readInt()
const blocksRemoved = readInt()
const origFileName = readString()
let loop = 0
let maxLoopCount = 0
let loopStartTick = 0
if (format >= 4) {
loop = readByte()
maxLoopCount = readByte()
loopStartTick = readShort()
}
const nbsNotes = []
let tick = -1
while (true) {
const tickJumps = readShort()
if (tickJumps === 0) break
tick += tickJumps
let layer = -1
while (true) {
const layerJumps = readShort()
if (layerJumps === 0) break
layer += layerJumps
const note = nbsNote()
note.tick = tick
note.layer = layer
note.instrument = readByte()
note.key = readByte()
if (format >= 4) {
note.velocity = readByte()
note.panning = readByte()
note.pitch = readShort()
}
nbsNotes.push(note)
}
}
const nbsLayers = []
if (i <= buffer.length) {
for (let j = 0; j < layerCount; j++) {
const layer = nbsLayer()
layer.name = readString()
if (format >= 4) {
layer.lock = readByte()
}
layer.volume = readByte()
if (format >= 2) {
layer.stereo = readByte()
}
nbsLayers.push(layer)
}
}
return {
songLength,
format,
vanillaInstrumentCount,
layerCount,
songName,
songAuthor,
songOriginalAuthor,
songDescription,
tempo,
autoSaving,
autoSavingDuration,
timeSignature,
minutesSpent,
leftClicks,
rightClicks,
blocksAdded,
blocksRemoved,
origFileName,
loop,
maxLoopCount,
loopStartTick,
nbsNotes,
nbsLayers
}
function readByte () {
return buffer.readInt8(i++)
}
function readShort () {
const short = buffer.readInt16LE(i)
i += 2
return short
}
function readInt () {
const int = buffer.readInt32LE(i)
i += 4
return int
}
function readString () {
let length = readInt()
let string = ''
for (; i > 0; i--) string += String.fromCharCode(readByte())
return string
}
}
function nbsNote () {
return {
tick: null,
layer: null,
instrument: null,
key: null,
velocity: 100,
panning: 100,
pitch: 0
}
}
function nbsLayer () {
return {
name: null,
lock: 0,
volume: null,
stereo: 100
}
}
module.exports = { parse, nbsNote, nbsLayer }

7
util/regexp.js Normal file
View file

@ -0,0 +1,7 @@
// Useful RegExp s
module.exports = {
ESCAPE_SEQUENCE: /\xa7.?/g,
VALID_ESCAPE_SEQUENCE: /\xa7[0-9a-fkl-orA-FKL-OR]/g,
INVALID_ESCAPE_SEQUENCE: /\xa7[^0-9a-fkl-orA-FKL-OR]/g,
UUID: /^[0-9a-fA-F]{8}\b\-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/
}

View file

@ -0,0 +1,23 @@
const styles = {
special: '\xa73',
number: '\xa76',
bigint: '\xa76',
boolean: '\xa76',
undefined: '\xa78',
null: '\xa7l',
string: '\xa72',
symbol: '\xa72',
date: '\xa75',
// "name": intentionally not styling
// TODO(BridgeAR): Highlight regular expressions properly.
regexp: '\xa74',
module: '\xa7n'
}
function stylizeWithColor (str, styleType) {
const style = styles[styleType]
if (style !== undefined) return `${style}${str}\xa7r`
return str
}
module.exports = { stylizeWithColor, styles }

8
util/uuid-to-nbt-uuid.js Normal file
View file

@ -0,0 +1,8 @@
// originally from https://gist.github.com/storycraft/7813dd0186e85daa393e1df9cfa19f2a
const nbt = require('prismarine-nbt')
function toNBTUUID (uuid) {
return nbt.intArray(nbt.int(uuid.replace(/-/g, '').match(/.{8}/g).map(str => Number.parseInt(str, 16)).map(num => num & 0x80000000 ? num - 0xffffffff - 1 : num)))
}
module.exports = toNBTUUID