cemu-smm
Advanced tools
Comparing version 1.1.0 to 1.1.2
@@ -12,2 +12,3 @@ "use strict"; | ||
var createCourse = require("./course"); | ||
var Tnl = require("./tnl"); | ||
@@ -30,2 +31,10 @@ var SAVE_SIZE = 0xA000; | ||
this.courses = {}; | ||
this.slotToIndex = {}; | ||
for (var i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
var index = this.data.readUInt8(SAVE_ORDER_OFFSET + i); | ||
if (index !== 255) { | ||
this.slotToIndex[i] = index; | ||
} | ||
} | ||
} | ||
@@ -75,127 +84,110 @@ | ||
reorder: function () { | ||
var _ref2 = _asyncToGenerator(regeneratorRuntime.mark(function _callee3() { | ||
var _ref2 = _asyncToGenerator(regeneratorRuntime.mark(function _callee4() { | ||
var _this2 = this; | ||
return regeneratorRuntime.wrap(function _callee3$(_context3) { | ||
return regeneratorRuntime.wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
_context3.next = 2; | ||
_context4.next = 2; | ||
return new Promise(function () { | ||
var _ref3 = _asyncToGenerator(regeneratorRuntime.mark(function _callee2(resolve, reject) { | ||
var numbers, i, index, missingNo, _i, promises, _loop, _i2, _loop2, _i3, _i4; | ||
return regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
var _ref3 = _asyncToGenerator(regeneratorRuntime.mark(function _callee3(resolve) { | ||
return regeneratorRuntime.wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
_context2.prev = 0; | ||
_context3.prev = 0; | ||
return _context3.delegateYield(regeneratorRuntime.mark(function _callee2() { | ||
var promises, slotToIndex, _loop, i, _loop2; | ||
if (!(_this2.data.slice(SAVE_ORDER_OFFSET, SAVE_ORDER_OFFSET + SAVE_ORDER_SIZE).readUInt32BE(0) !== 0)) { | ||
_context2.next = 21; | ||
break; | ||
} | ||
return regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
// rename course folders | ||
promises = []; | ||
slotToIndex = {}; | ||
// find all unused slots | ||
numbers = []; | ||
Object.assign(slotToIndex, _this2.slotToIndex); | ||
for (i = SAVE_ORDER_SIZE - 1; i >= 0; i--) { | ||
index = _this2.data.readUInt8(SAVE_ORDER_OFFSET + i); | ||
_loop = function _loop(i) { | ||
promises.push(new Promise(function (resolve) { | ||
var value = slotToIndex[i]; | ||
var srcPath = path.resolve(_this2.pathToSave + "/course" + parseInt(i).pad(3)); | ||
var dstPath = path.resolve(_this2.pathToSave + "/course" + value.pad(3) + "_reorder"); | ||
fs.rename(srcPath, dstPath, function () { | ||
_this2.slotToIndex[value] = value; | ||
_this2.data.writeUInt8(value, SAVE_ORDER_OFFSET + value); | ||
resolve(); | ||
}); | ||
resolve(); | ||
})); | ||
}; | ||
if (index !== 255) { | ||
numbers.push(index); | ||
} | ||
} | ||
missingNo = []; | ||
for (i in slotToIndex) { | ||
_loop(i); | ||
} | ||
_context2.next = 7; | ||
return Promise.all(promises); | ||
for (_i = 0; _i < SAVE_ORDER_SIZE; _i++) { | ||
if (!numbers.includes(_i)) { | ||
missingNo.push(_i); | ||
} | ||
} | ||
case 7: | ||
promises = []; | ||
// rename course folders | ||
promises = []; | ||
_loop2 = function _loop2(i) { | ||
promises.push(new Promise(function (resolve) { | ||
var srcPath = path.resolve(_this2.pathToSave + "/course" + i.pad(3) + "_reorder"); | ||
var dstPath = path.resolve(_this2.pathToSave + "/course" + i.pad(3)); | ||
fs.rename(srcPath, dstPath, function (err) { | ||
if (err) { | ||
if (_this2.slotToIndex[i]) { | ||
delete _this2.slotToIndex[i]; | ||
} | ||
_this2.data.writeUInt8(SAVE_ORDER_EMPTY, SAVE_ORDER_OFFSET + i); | ||
} | ||
resolve(); | ||
}); | ||
})); | ||
}; | ||
_loop = function _loop(_i2) { | ||
var index = _this2.data.readUInt8(SAVE_ORDER_OFFSET + _i2); | ||
if (index !== 255) { | ||
promises.push(new Promise(function (resolve) { | ||
var srcPath = path.resolve(_this2.pathToSave + "/course" + _i2.pad(3)); | ||
var dstPath = path.resolve(_this2.pathToSave + "/course" + index.pad(3) + "_reorder"); | ||
fs.rename(srcPath, dstPath, function () { | ||
resolve(); | ||
}); | ||
resolve(); | ||
})); | ||
} | ||
}; | ||
for (i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
_loop2(i); | ||
} | ||
_context2.next = 12; | ||
return Promise.all(promises); | ||
for (_i2 = 0; _i2 < SAVE_ORDER_SIZE; _i2++) { | ||
_loop(_i2); | ||
} | ||
_context2.next = 11; | ||
return Promise.all(promises); | ||
case 12: | ||
case 11: | ||
promises = []; | ||
// recalculate checksum | ||
_this2.writeCrc(); | ||
_loop2 = function _loop2(_i3) { | ||
promises.push(new Promise(function (resolve) { | ||
var srcPath = path.resolve(_this2.pathToSave + "/course" + _i3.pad(3) + "_reorder"); | ||
var dstPath = path.resolve(_this2.pathToSave + "/course" + _i3.pad(3)); | ||
fs.rename(srcPath, dstPath, function () { | ||
// somehow this does not throw an error if srcPath does not exist | ||
resolve(); | ||
}); | ||
resolve(); | ||
})); | ||
}; | ||
resolve(); | ||
for (_i3 = 0; _i3 < SAVE_ORDER_SIZE; _i3++) { | ||
_loop2(_i3); | ||
} | ||
_context2.next = 16; | ||
return Promise.all(promises); | ||
case 14: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, _this2); | ||
})(), "t0", 2); | ||
case 16: | ||
// write bytes to 'save.dat' | ||
for (_i4 = 0; _i4 < SAVE_ORDER_SIZE; _i4++) { | ||
if (missingNo.includes(_i4)) { | ||
_this2.data.writeUInt8(SAVE_ORDER_EMPTY, SAVE_ORDER_OFFSET + _i4); | ||
} else { | ||
_this2.data.writeUInt8(_i4, SAVE_ORDER_OFFSET + _i4); | ||
} | ||
} | ||
// recalculate checksum | ||
_this2.writeCrc(); | ||
resolve(); | ||
_context2.next = 22; | ||
case 2: | ||
_context3.next = 7; | ||
break; | ||
case 21: | ||
reject("No course has been saved so far"); | ||
case 4: | ||
_context3.prev = 4; | ||
_context3.t1 = _context3["catch"](0); | ||
case 22: | ||
_context2.next = 27; | ||
break; | ||
console.log(_context3.t1); | ||
// TODO undo changes | ||
case 24: | ||
_context2.prev = 24; | ||
_context2.t0 = _context2["catch"](0); | ||
console.log(_context2.t0); | ||
case 27: | ||
case 7: | ||
case "end": | ||
return _context2.stop(); | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee2, _this2, [[0, 24]]); | ||
}, _callee3, _this2, [[0, 4]]); | ||
})); | ||
return function (_x, _x2) { | ||
return function (_x) { | ||
return _ref3.apply(this, arguments); | ||
@@ -207,6 +199,6 @@ }; | ||
case "end": | ||
return _context3.stop(); | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee3, this); | ||
}, _callee4, this); | ||
})); | ||
@@ -224,52 +216,31 @@ | ||
try { | ||
if (this.data.slice(SAVE_ORDER_OFFSET, SAVE_ORDER_OFFSET + SAVE_ORDER_SIZE).readUInt32BE(0) !== 0) { | ||
// find all unused slots | ||
var numbers = []; | ||
for (var i = SAVE_ORDER_SIZE - 1; i >= 0; i--) { | ||
var index = this.data.readUInt8(SAVE_ORDER_OFFSET + i); | ||
if (index !== 255) { | ||
numbers.push(index); | ||
// rename course folders | ||
var slotToIndex = {}; | ||
Object.assign(slotToIndex, this.slotToIndex); | ||
for (var i in this.slotToIndex) { | ||
var value = slotToIndex[i]; | ||
var srcPath = path.resolve(this.pathToSave + "/course" + parseInt(i).pad(3)); | ||
var dstPath = path.resolve(this.pathToSave + "/course" + value.pad(3) + "_reorder"); | ||
fs.renameSync(srcPath, dstPath); | ||
this.slotToIndex[value] = value; | ||
this.data.writeUInt8(value, SAVE_ORDER_OFFSET + value); | ||
} | ||
for (var _i = 0; _i < SAVE_ORDER_SIZE; _i++) { | ||
var _srcPath = path.resolve(this.pathToSave + "/course" + _i.pad(3) + "_reorder"); | ||
var _dstPath = path.resolve(this.pathToSave + "/course" + _i.pad(3)); | ||
try { | ||
fs.renameSync(_srcPath, _dstPath); | ||
} catch (err) { | ||
if (this.slotToIndex[_i]) { | ||
delete this.slotToIndex[_i]; | ||
} | ||
this.data.writeUInt8(SAVE_ORDER_EMPTY, SAVE_ORDER_OFFSET + _i); | ||
} | ||
var missingNo = []; | ||
for (var _i5 = 0; _i5 < SAVE_ORDER_SIZE; _i5++) { | ||
if (!numbers.includes(_i5)) { | ||
missingNo.push(_i5); | ||
} | ||
} | ||
} | ||
// rename course folders | ||
for (var _i6 = 0; _i6 < SAVE_ORDER_SIZE; _i6++) { | ||
var _index = this.data.readUInt8(SAVE_ORDER_OFFSET + _i6); | ||
if (_index !== 255) { | ||
var srcPath = path.resolve(this.pathToSave + "/course" + _i6.pad(3)); | ||
var dstPath = path.resolve(this.pathToSave + "/course" + _index.pad(3) + "_reorder"); | ||
fs.renameSync(srcPath, dstPath); | ||
} | ||
} | ||
for (var _i7 = 0; _i7 < SAVE_ORDER_SIZE; _i7++) { | ||
var _srcPath = path.resolve(this.pathToSave + "/course" + _i7.pad(3) + "_reorder"); | ||
var _dstPath = path.resolve(this.pathToSave + "/course" + _i7.pad(3)); | ||
try { | ||
fs.renameSync(_srcPath, _dstPath); | ||
} catch (err) {// ignore | ||
} | ||
} | ||
// write bytes to 'save.dat' | ||
for (var _i8 = 0; _i8 < SAVE_ORDER_SIZE; _i8++) { | ||
if (missingNo.includes(_i8)) { | ||
this.data.writeUInt8(SAVE_ORDER_EMPTY, SAVE_ORDER_OFFSET + _i8); | ||
} else { | ||
this.data.writeUInt8(_i8, SAVE_ORDER_OFFSET + _i8); | ||
} | ||
} | ||
// recalculate checksum | ||
this.writeCrc(); | ||
} else { | ||
console.log("No course has been saved so far"); | ||
} | ||
// recalculate checksum | ||
this.writeCrc(); | ||
} catch (err) { | ||
console.log(err); | ||
// TODO undo changes | ||
} | ||
@@ -279,3 +250,3 @@ }, | ||
exportJpeg: function () { | ||
var _ref4 = _asyncToGenerator(regeneratorRuntime.mark(function _callee7() { | ||
var _ref4 = _asyncToGenerator(regeneratorRuntime.mark(function _callee8() { | ||
var _this3 = this; | ||
@@ -285,5 +256,5 @@ | ||
return regeneratorRuntime.wrap(function _callee7$(_context7) { | ||
return regeneratorRuntime.wrap(function _callee8$(_context8) { | ||
while (1) { | ||
switch (_context7.prev = _context7.next) { | ||
switch (_context8.prev = _context8.next) { | ||
case 0: | ||
@@ -295,10 +266,10 @@ promises = []; | ||
promises.push(new Promise(function () { | ||
var _ref5 = _asyncToGenerator(regeneratorRuntime.mark(function _callee6(resolve) { | ||
var _ref5 = _asyncToGenerator(regeneratorRuntime.mark(function _callee7(resolve) { | ||
var exists; | ||
return regeneratorRuntime.wrap(function _callee6$(_context6) { | ||
return regeneratorRuntime.wrap(function _callee7$(_context7) { | ||
while (1) { | ||
switch (_context6.prev = _context6.next) { | ||
switch (_context7.prev = _context7.next) { | ||
case 0: | ||
exists = false; | ||
_context6.next = 3; | ||
_context7.next = 3; | ||
return new Promise(function (resolve) { | ||
@@ -313,21 +284,21 @@ fs.access(coursePath, fs.constants.R_OK | fs.constants.W_OK, function (err) { | ||
if (!exists) { | ||
_context6.next = 6; | ||
_context7.next = 6; | ||
break; | ||
} | ||
_context6.next = 6; | ||
_context7.next = 6; | ||
return Promise.all([new Promise(function () { | ||
var _ref6 = _asyncToGenerator(regeneratorRuntime.mark(function _callee4(resolve) { | ||
var _ref6 = _asyncToGenerator(regeneratorRuntime.mark(function _callee5(resolve) { | ||
var tnl, jpeg; | ||
return regeneratorRuntime.wrap(function _callee4$(_context4) { | ||
return regeneratorRuntime.wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
_context4.prev = 0; | ||
_context5.prev = 0; | ||
tnl = new Tnl(coursePath + "/thumbnail0.tnl"); | ||
_context4.next = 4; | ||
_context5.next = 4; | ||
return tnl.toJpeg(); | ||
case 4: | ||
jpeg = _context4.sent; | ||
jpeg = _context5.sent; | ||
@@ -337,8 +308,8 @@ fs.writeFile(coursePath + "/thumbnail0.jpg", jpeg, null, function () { | ||
}); | ||
_context4.next = 11; | ||
_context5.next = 11; | ||
break; | ||
case 8: | ||
_context4.prev = 8; | ||
_context4.t0 = _context4["catch"](0); | ||
_context5.prev = 8; | ||
_context5.t0 = _context5["catch"](0); | ||
@@ -349,25 +320,25 @@ resolve(); | ||
case "end": | ||
return _context4.stop(); | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee4, _this3, [[0, 8]]); | ||
}, _callee5, _this3, [[0, 8]]); | ||
})); | ||
return function (_x4) { | ||
return function (_x3) { | ||
return _ref6.apply(this, arguments); | ||
}; | ||
}()), new Promise(function () { | ||
var _ref7 = _asyncToGenerator(regeneratorRuntime.mark(function _callee5(resolve) { | ||
var _ref7 = _asyncToGenerator(regeneratorRuntime.mark(function _callee6(resolve) { | ||
var tnl, jpeg; | ||
return regeneratorRuntime.wrap(function _callee5$(_context5) { | ||
return regeneratorRuntime.wrap(function _callee6$(_context6) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
switch (_context6.prev = _context6.next) { | ||
case 0: | ||
_context5.prev = 0; | ||
_context6.prev = 0; | ||
tnl = new Tnl(coursePath + "/thumbnail1.tnl"); | ||
_context5.next = 4; | ||
_context6.next = 4; | ||
return tnl.toJpeg(); | ||
case 4: | ||
jpeg = _context5.sent; | ||
jpeg = _context6.sent; | ||
@@ -377,8 +348,8 @@ fs.writeFile(coursePath + "/thumbnail1.jpg", jpeg, null, function () { | ||
}); | ||
_context5.next = 11; | ||
_context6.next = 11; | ||
break; | ||
case 8: | ||
_context5.prev = 8; | ||
_context5.t0 = _context5["catch"](0); | ||
_context6.prev = 8; | ||
_context6.t0 = _context6["catch"](0); | ||
@@ -389,9 +360,9 @@ resolve(); | ||
case "end": | ||
return _context5.stop(); | ||
return _context6.stop(); | ||
} | ||
} | ||
}, _callee5, _this3, [[0, 8]]); | ||
}, _callee6, _this3, [[0, 8]]); | ||
})); | ||
return function (_x5) { | ||
return function (_x4) { | ||
return _ref7.apply(this, arguments); | ||
@@ -406,9 +377,9 @@ }; | ||
case "end": | ||
return _context6.stop(); | ||
return _context7.stop(); | ||
} | ||
} | ||
}, _callee6, _this3); | ||
}, _callee7, _this3); | ||
})); | ||
return function (_x3) { | ||
return function (_x2) { | ||
return _ref5.apply(this, arguments); | ||
@@ -422,3 +393,3 @@ }; | ||
} | ||
_context7.next = 5; | ||
_context8.next = 5; | ||
return Promise.all(promises); | ||
@@ -428,6 +399,6 @@ | ||
case "end": | ||
return _context7.stop(); | ||
return _context8.stop(); | ||
} | ||
} | ||
}, _callee7, this); | ||
}, _callee8, this); | ||
})); | ||
@@ -442,4 +413,29 @@ | ||
exportJpegSync: function exportJpegSync() { | ||
for (var i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
var _coursePath = path.resolve(this.pathToSave + "/course" + i.pad(3) + "/"); | ||
var exists = true; | ||
try { | ||
fs.accessSync(_coursePath, fs.constants.R_OK | fs.constants.W_OK); | ||
} catch (err) { | ||
exists = false; | ||
} | ||
if (exists) { | ||
try { | ||
var tnl = new Tnl(_coursePath + "/thumbnail0.tnl"); | ||
var jpeg = tnl.toJpegSync(); | ||
fs.writeFileSync(_coursePath + "/thumbnail0.jpg", jpeg); | ||
} catch (err) {} | ||
try { | ||
var _tnl = new Tnl(_coursePath + "/thumbnail1.tnl"); | ||
var _jpeg = _tnl.toJpegSync(); | ||
fs.writeFileSync(_coursePath + "/thumbnail1.jpg", _jpeg); | ||
} catch (err) {} | ||
} | ||
} | ||
}, | ||
importJpeg: function () { | ||
var _ref8 = _asyncToGenerator(regeneratorRuntime.mark(function _callee11() { | ||
var _ref8 = _asyncToGenerator(regeneratorRuntime.mark(function _callee12() { | ||
var _this4 = this; | ||
@@ -449,5 +445,5 @@ | ||
return regeneratorRuntime.wrap(function _callee11$(_context11) { | ||
return regeneratorRuntime.wrap(function _callee12$(_context12) { | ||
while (1) { | ||
switch (_context11.prev = _context11.next) { | ||
switch (_context12.prev = _context12.next) { | ||
case 0: | ||
@@ -459,10 +455,10 @@ promises = []; | ||
promises.push(new Promise(function () { | ||
var _ref9 = _asyncToGenerator(regeneratorRuntime.mark(function _callee10(resolve) { | ||
var _ref9 = _asyncToGenerator(regeneratorRuntime.mark(function _callee11(resolve) { | ||
var exists; | ||
return regeneratorRuntime.wrap(function _callee10$(_context10) { | ||
return regeneratorRuntime.wrap(function _callee11$(_context11) { | ||
while (1) { | ||
switch (_context10.prev = _context10.next) { | ||
switch (_context11.prev = _context11.next) { | ||
case 0: | ||
exists = false; | ||
_context10.next = 3; | ||
_context11.next = 3; | ||
return new Promise(function (resolve) { | ||
@@ -477,21 +473,21 @@ fs.access(coursePath, fs.constants.R_OK | fs.constants.W_OK, function (err) { | ||
if (!exists) { | ||
_context10.next = 6; | ||
_context11.next = 6; | ||
break; | ||
} | ||
_context10.next = 6; | ||
_context11.next = 6; | ||
return Promise.all([new Promise(function () { | ||
var _ref10 = _asyncToGenerator(regeneratorRuntime.mark(function _callee8(resolve) { | ||
var _ref10 = _asyncToGenerator(regeneratorRuntime.mark(function _callee9(resolve) { | ||
var jpeg, tnl; | ||
return regeneratorRuntime.wrap(function _callee8$(_context8) { | ||
return regeneratorRuntime.wrap(function _callee9$(_context9) { | ||
while (1) { | ||
switch (_context8.prev = _context8.next) { | ||
switch (_context9.prev = _context9.next) { | ||
case 0: | ||
_context8.prev = 0; | ||
_context9.prev = 0; | ||
jpeg = new Tnl(coursePath + "/thumbnail0.jpg"); | ||
_context8.next = 4; | ||
_context9.next = 4; | ||
return jpeg.fromJpeg(true); | ||
case 4: | ||
tnl = _context8.sent; | ||
tnl = _context9.sent; | ||
@@ -501,8 +497,8 @@ fs.writeFile(coursePath + "/thumbnail0.tnl", tnl, null, function () { | ||
}); | ||
_context8.next = 11; | ||
_context9.next = 11; | ||
break; | ||
case 8: | ||
_context8.prev = 8; | ||
_context8.t0 = _context8["catch"](0); | ||
_context9.prev = 8; | ||
_context9.t0 = _context9["catch"](0); | ||
@@ -513,25 +509,25 @@ resolve(); | ||
case "end": | ||
return _context8.stop(); | ||
return _context9.stop(); | ||
} | ||
} | ||
}, _callee8, _this4, [[0, 8]]); | ||
}, _callee9, _this4, [[0, 8]]); | ||
})); | ||
return function (_x7) { | ||
return function (_x6) { | ||
return _ref10.apply(this, arguments); | ||
}; | ||
}()), new Promise(function () { | ||
var _ref11 = _asyncToGenerator(regeneratorRuntime.mark(function _callee9(resolve) { | ||
var _ref11 = _asyncToGenerator(regeneratorRuntime.mark(function _callee10(resolve) { | ||
var jpeg, tnl; | ||
return regeneratorRuntime.wrap(function _callee9$(_context9) { | ||
return regeneratorRuntime.wrap(function _callee10$(_context10) { | ||
while (1) { | ||
switch (_context9.prev = _context9.next) { | ||
switch (_context10.prev = _context10.next) { | ||
case 0: | ||
_context9.prev = 0; | ||
_context10.prev = 0; | ||
jpeg = new Tnl(coursePath + "/thumbnail1.jpg"); | ||
_context9.next = 4; | ||
_context10.next = 4; | ||
return jpeg.fromJpeg(false); | ||
case 4: | ||
tnl = _context9.sent; | ||
tnl = _context10.sent; | ||
@@ -541,8 +537,8 @@ fs.writeFile(coursePath + "/thumbnail1.tnl", tnl, null, function () { | ||
}); | ||
_context9.next = 11; | ||
_context10.next = 11; | ||
break; | ||
case 8: | ||
_context9.prev = 8; | ||
_context9.t0 = _context9["catch"](0); | ||
_context10.prev = 8; | ||
_context10.t0 = _context10["catch"](0); | ||
@@ -553,9 +549,9 @@ resolve(); | ||
case "end": | ||
return _context9.stop(); | ||
return _context10.stop(); | ||
} | ||
} | ||
}, _callee9, _this4, [[0, 8]]); | ||
}, _callee10, _this4, [[0, 8]]); | ||
})); | ||
return function (_x8) { | ||
return function (_x7) { | ||
return _ref11.apply(this, arguments); | ||
@@ -570,9 +566,9 @@ }; | ||
case "end": | ||
return _context10.stop(); | ||
return _context11.stop(); | ||
} | ||
} | ||
}, _callee10, _this4); | ||
}, _callee11, _this4); | ||
})); | ||
return function (_x6) { | ||
return function (_x5) { | ||
return _ref9.apply(this, arguments); | ||
@@ -586,3 +582,3 @@ }; | ||
} | ||
_context11.next = 5; | ||
_context12.next = 5; | ||
return Promise.all(promises); | ||
@@ -592,6 +588,6 @@ | ||
case "end": | ||
return _context11.stop(); | ||
return _context12.stop(); | ||
} | ||
} | ||
}, _callee11, this); | ||
}, _callee12, this); | ||
})); | ||
@@ -607,3 +603,3 @@ | ||
loadCourses: function () { | ||
var _ref12 = _asyncToGenerator(regeneratorRuntime.mark(function _callee13() { | ||
var _ref12 = _asyncToGenerator(regeneratorRuntime.mark(function _callee14() { | ||
var _this5 = this; | ||
@@ -613,5 +609,5 @@ | ||
return regeneratorRuntime.wrap(function _callee13$(_context13) { | ||
return regeneratorRuntime.wrap(function _callee14$(_context14) { | ||
while (1) { | ||
switch (_context13.prev = _context13.next) { | ||
switch (_context14.prev = _context14.next) { | ||
case 0: | ||
@@ -622,7 +618,7 @@ promises = []; | ||
promises.push(new Promise(function () { | ||
var _ref13 = _asyncToGenerator(regeneratorRuntime.mark(function _callee12(resolve) { | ||
var _ref13 = _asyncToGenerator(regeneratorRuntime.mark(function _callee13(resolve) { | ||
var exists, courseName, coursePath; | ||
return regeneratorRuntime.wrap(function _callee12$(_context12) { | ||
return regeneratorRuntime.wrap(function _callee13$(_context13) { | ||
while (1) { | ||
switch (_context12.prev = _context12.next) { | ||
switch (_context13.prev = _context13.next) { | ||
case 0: | ||
@@ -632,3 +628,3 @@ exists = false; | ||
coursePath = path.resolve(_this5.pathToSave + "/" + courseName + "/"); | ||
_context12.next = 5; | ||
_context13.next = 5; | ||
return new Promise(function (resolve) { | ||
@@ -643,11 +639,11 @@ fs.access(coursePath, fs.constants.R_OK | fs.constants.W_OK, function (err) { | ||
if (!exists) { | ||
_context12.next = 9; | ||
_context13.next = 9; | ||
break; | ||
} | ||
_context12.next = 8; | ||
_context13.next = 8; | ||
return createCourse(i, coursePath); | ||
case 8: | ||
_this5.courses[courseName] = _context12.sent; | ||
_this5.courses[courseName] = _context13.sent; | ||
@@ -659,9 +655,9 @@ case 9: | ||
case "end": | ||
return _context12.stop(); | ||
return _context13.stop(); | ||
} | ||
} | ||
}, _callee12, _this5); | ||
}, _callee13, _this5); | ||
})); | ||
return function (_x9) { | ||
return function (_x8) { | ||
return _ref13.apply(this, arguments); | ||
@@ -675,14 +671,14 @@ }; | ||
} | ||
_context13.next = 5; | ||
_context14.next = 5; | ||
return Promise.all(promises); | ||
case 5: | ||
return _context13.abrupt("return", this.courses); | ||
return _context14.abrupt("return", this.courses); | ||
case 6: | ||
case "end": | ||
return _context13.stop(); | ||
return _context14.stop(); | ||
} | ||
} | ||
}, _callee13, this); | ||
}, _callee14, this); | ||
})); | ||
@@ -698,8 +694,8 @@ | ||
loadCoursesSync: function () { | ||
var _ref14 = _asyncToGenerator(regeneratorRuntime.mark(function _callee14() { | ||
var i, courseName, _coursePath; | ||
var _ref14 = _asyncToGenerator(regeneratorRuntime.mark(function _callee15() { | ||
var i, courseName, _coursePath2; | ||
return regeneratorRuntime.wrap(function _callee14$(_context14) { | ||
return regeneratorRuntime.wrap(function _callee15$(_context15) { | ||
while (1) { | ||
switch (_context14.prev = _context14.next) { | ||
switch (_context15.prev = _context15.next) { | ||
case 0: | ||
@@ -710,3 +706,3 @@ i = 0; | ||
if (!(i < SAVE_ORDER_SIZE)) { | ||
_context14.next = 16; | ||
_context15.next = 16; | ||
break; | ||
@@ -716,32 +712,32 @@ } | ||
courseName = "course" + i.pad(3); | ||
_coursePath = path.resolve(this.pathToSave + "/" + courseName + "/"); | ||
_context14.prev = 4; | ||
_coursePath2 = path.resolve(this.pathToSave + "/" + courseName + "/"); | ||
_context15.prev = 4; | ||
fs.accessSync(_coursePath, fs.constants.R_OK | fs.constants.W_OK); | ||
_context14.next = 8; | ||
return createCourse(i, _coursePath); | ||
fs.accessSync(_coursePath2, fs.constants.R_OK | fs.constants.W_OK); | ||
_context15.next = 8; | ||
return createCourse(i, _coursePath2); | ||
case 8: | ||
this.courses[courseName] = _context14.sent; | ||
_context14.next = 13; | ||
this.courses[courseName] = _context15.sent; | ||
_context15.next = 13; | ||
break; | ||
case 11: | ||
_context14.prev = 11; | ||
_context14.t0 = _context14["catch"](4); | ||
_context15.prev = 11; | ||
_context15.t0 = _context15["catch"](4); | ||
case 13: | ||
i++; | ||
_context14.next = 1; | ||
_context15.next = 1; | ||
break; | ||
case 16: | ||
return _context14.abrupt("return", this.courses); | ||
return _context15.abrupt("return", this.courses); | ||
case 17: | ||
case "end": | ||
return _context14.stop(); | ||
return _context15.stop(); | ||
} | ||
} | ||
}, _callee14, this, [[4, 11]]); | ||
}, _callee15, this, [[4, 11]]); | ||
})); | ||
@@ -748,0 +744,0 @@ |
@@ -59,2 +59,9 @@ "use strict"; | ||
toJpegSync: function toJpegSync() { | ||
var data = fs.readFileSync(this.pathToFile); | ||
var length = data.readUInt32BE(4); | ||
return data.slice(8, 8 + length); | ||
}, | ||
fromJpeg: function () { | ||
@@ -61,0 +68,0 @@ var _ref2 = _asyncToGenerator(regeneratorRuntime.mark(function _callee4(isWide) { |
{ | ||
"name": "cemu-smm", | ||
"version": "1.1.0", | ||
"version": "1.1.2", | ||
"description": "This is a module to simplify all kinds of tasks with Loadiine Super Mario Maker save files and respectively Cemu", | ||
"main": "index.js", | ||
"scripts": { | ||
"compile": "babel src --out-dir legacy" | ||
"compile": "babel src --out-dir legacy", | ||
"test": "node test/test" | ||
}, | ||
@@ -9,0 +10,0 @@ "author": "Mario Reder", |
205
src/save.js
@@ -8,2 +8,3 @@ const Promise = require("bluebird"); | ||
const createCourse = require("./course"); | ||
const Tnl = require("./tnl"); | ||
@@ -26,2 +27,10 @@ const SAVE_SIZE = 0xA000; | ||
this.courses = {}; | ||
this.slotToIndex = {}; | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
let index = this.data.readUInt8(SAVE_ORDER_OFFSET + i); | ||
if (index !== 255) { | ||
this.slotToIndex[i] = index; | ||
} | ||
} | ||
} | ||
@@ -52,68 +61,47 @@ | ||
await new Promise(async (resolve, reject) => { | ||
await new Promise(async (resolve) => { | ||
try { | ||
if (this.data.slice(SAVE_ORDER_OFFSET, SAVE_ORDER_OFFSET + SAVE_ORDER_SIZE).readUInt32BE(0) !== 0) { | ||
// find all unused slots | ||
let numbers = []; | ||
for (let i = SAVE_ORDER_SIZE - 1; i >= 0; i--) { | ||
let index = this.data.readUInt8(SAVE_ORDER_OFFSET + i); | ||
if (index !== 255) { | ||
numbers.push(index); | ||
} | ||
} | ||
let missingNo = []; | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
if (!numbers.includes(i)) { | ||
missingNo.push(i); | ||
} | ||
} | ||
// rename course folders | ||
let promises = []; | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
let index = this.data.readUInt8(SAVE_ORDER_OFFSET + i); | ||
if (index !== 255) { | ||
promises.push(new Promise((resolve) => { | ||
let srcPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}`); | ||
let dstPath = path.resolve(`${this.pathToSave}/course${(index).pad(3)}_reorder`); | ||
fs.rename(srcPath, dstPath, () => { | ||
resolve(); | ||
}); | ||
resolve(); | ||
})); | ||
} | ||
} | ||
await Promise.all(promises); | ||
promises = []; | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
promises.push(new Promise((resolve) => { | ||
let srcPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}_reorder`); | ||
let dstPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}`); | ||
fs.rename(srcPath, dstPath, () => { | ||
// somehow this does not throw an error if srcPath does not exist | ||
resolve(); | ||
}); | ||
// rename course folders | ||
let promises = []; | ||
let slotToIndex = {}; | ||
Object.assign(slotToIndex, this.slotToIndex); | ||
for (let i in slotToIndex) { | ||
promises.push(new Promise((resolve) => { | ||
let value = slotToIndex[i]; | ||
let srcPath = path.resolve(`${this.pathToSave}/course${parseInt(i).pad(3)}`); | ||
let dstPath = path.resolve(`${this.pathToSave}/course${value.pad(3)}_reorder`); | ||
fs.rename(srcPath, dstPath, () => { | ||
this.slotToIndex[value] = value; | ||
this.data.writeUInt8(value, SAVE_ORDER_OFFSET + value); | ||
resolve(); | ||
})); | ||
} | ||
await Promise.all(promises); | ||
}); | ||
resolve(); | ||
})); | ||
} | ||
await Promise.all(promises); | ||
promises = []; | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
promises.push(new Promise((resolve) => { | ||
let srcPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}_reorder`); | ||
let dstPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}`); | ||
fs.rename(srcPath, dstPath, (err) => { | ||
if (err) { | ||
if (this.slotToIndex[i]) { | ||
delete this.slotToIndex[i]; | ||
} | ||
this.data.writeUInt8(SAVE_ORDER_EMPTY, SAVE_ORDER_OFFSET + i); | ||
} | ||
resolve(); | ||
}); | ||
})); | ||
} | ||
await Promise.all(promises); | ||
// write bytes to 'save.dat' | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
if (missingNo.includes(i)) { | ||
this.data.writeUInt8(SAVE_ORDER_EMPTY, SAVE_ORDER_OFFSET + i); | ||
} else { | ||
this.data.writeUInt8(i, SAVE_ORDER_OFFSET + i); | ||
} | ||
} | ||
// recalculate checksum | ||
this.writeCrc(); | ||
// recalculate checksum | ||
this.writeCrc(); | ||
resolve(); | ||
} else { | ||
reject("No course has been saved so far"); | ||
} | ||
resolve(); | ||
} catch (err) { | ||
console.log(err); | ||
// TODO undo changes | ||
} | ||
@@ -127,52 +115,31 @@ }); | ||
try { | ||
if (this.data.slice(SAVE_ORDER_OFFSET, SAVE_ORDER_OFFSET + SAVE_ORDER_SIZE).readUInt32BE(0) !== 0) { | ||
// find all unused slots | ||
let numbers = []; | ||
for (let i = SAVE_ORDER_SIZE - 1; i >= 0; i--) { | ||
let index = this.data.readUInt8(SAVE_ORDER_OFFSET + i); | ||
if (index !== 255) { | ||
numbers.push(index); | ||
// rename course folders | ||
let slotToIndex = {}; | ||
Object.assign(slotToIndex, this.slotToIndex); | ||
for (let i in this.slotToIndex) { | ||
let value = slotToIndex[i]; | ||
let srcPath = path.resolve(`${this.pathToSave}/course${parseInt(i).pad(3)}`); | ||
let dstPath = path.resolve(`${this.pathToSave}/course${value.pad(3)}_reorder`); | ||
fs.renameSync(srcPath, dstPath); | ||
this.slotToIndex[value] = value; | ||
this.data.writeUInt8(value, SAVE_ORDER_OFFSET + value); | ||
} | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
let srcPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}_reorder`); | ||
let dstPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}`); | ||
try { | ||
fs.renameSync(srcPath, dstPath); | ||
} catch (err) { | ||
if (this.slotToIndex[i]) { | ||
delete this.slotToIndex[i]; | ||
} | ||
this.data.writeUInt8(SAVE_ORDER_EMPTY, SAVE_ORDER_OFFSET + i); | ||
} | ||
let missingNo = []; | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
if (!numbers.includes(i)) { | ||
missingNo.push(i); | ||
} | ||
} | ||
} | ||
// rename course folders | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
let index = this.data.readUInt8(SAVE_ORDER_OFFSET + i); | ||
if (index !== 255) { | ||
let srcPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}`); | ||
let dstPath = path.resolve(`${this.pathToSave}/course${(index).pad(3)}_reorder`); | ||
fs.renameSync(srcPath, dstPath); | ||
} | ||
} | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
let srcPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}_reorder`); | ||
let dstPath = path.resolve(`${this.pathToSave}/course${i.pad(3)}`); | ||
try { | ||
fs.renameSync(srcPath, dstPath); | ||
} catch (err) { // ignore | ||
} | ||
} | ||
// write bytes to 'save.dat' | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
if (missingNo.includes(i)) { | ||
this.data.writeUInt8(SAVE_ORDER_EMPTY, SAVE_ORDER_OFFSET + i); | ||
} else { | ||
this.data.writeUInt8(i, SAVE_ORDER_OFFSET + i); | ||
} | ||
} | ||
// recalculate checksum | ||
this.writeCrc(); | ||
} else { | ||
console.log("No course has been saved so far"); | ||
} | ||
// recalculate checksum | ||
this.writeCrc(); | ||
} catch (err) { | ||
console.log(err); | ||
// TODO undo changes | ||
} | ||
@@ -228,2 +195,30 @@ | ||
exportJpegSync: function () { | ||
for (let i = 0; i < SAVE_ORDER_SIZE; i++) { | ||
let coursePath = path.resolve(`${this.pathToSave}/course${i.pad(3)}/`); | ||
let exists = true; | ||
try { | ||
fs.accessSync(coursePath, fs.constants.R_OK | fs.constants.W_OK); | ||
} catch (err) { | ||
exists = false; | ||
} | ||
if (exists) { | ||
try { | ||
let tnl = new Tnl(coursePath + "/thumbnail0.tnl"); | ||
let jpeg = tnl.toJpegSync(); | ||
fs.writeFileSync(coursePath + "/thumbnail0.jpg", jpeg) | ||
} catch (err) { | ||
} | ||
try { | ||
let tnl = new Tnl(coursePath + "/thumbnail1.tnl"); | ||
let jpeg = tnl.toJpegSync(); | ||
fs.writeFileSync(coursePath + "/thumbnail1.jpg", jpeg); | ||
} catch (err) { | ||
} | ||
} | ||
} | ||
}, | ||
importJpeg: async function () { | ||
@@ -230,0 +225,0 @@ |
@@ -42,2 +42,10 @@ const Promise = require("bluebird"); | ||
toJpegSync: function () { | ||
let data = fs.readFileSync(this.pathToFile); | ||
let length = data.readUInt32BE(4); | ||
return data.slice(8, 8 + length); | ||
}, | ||
fromJpeg: async function (isWide, doClip = false) { | ||
@@ -44,0 +52,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
205190
1815
0