mirror of
https://github.com/themitosan/fpPS4-Temmie-s-Launcher.git
synced 2024-06-22 14:12:35 -04:00
Project: Update readme and fix more stuff on non-windows os
This commit is contained in:
parent
140cb016f6
commit
2093642ed8
13
.gitignore
vendored
13
.gitignore
vendored
|
@ -1,7 +1,11 @@
|
||||||
# Paths
|
# Paths
|
||||||
Games/*
|
Games/
|
||||||
Nwjs/*
|
Nwjs/
|
||||||
Emu/*
|
Emu/
|
||||||
|
|
||||||
|
# Paths generated by fpPS4
|
||||||
|
shader_dump/
|
||||||
|
savedata/
|
||||||
|
|
||||||
# Launcher settings
|
# Launcher settings
|
||||||
Settings.json
|
Settings.json
|
||||||
|
@ -17,4 +21,5 @@ Settings.json
|
||||||
*.zip
|
*.zip
|
||||||
*.pkg
|
*.pkg
|
||||||
*.log
|
*.log
|
||||||
*.dat
|
*.dat
|
||||||
|
*.sh
|
|
@ -695,7 +695,7 @@ temp_DESIGN = {
|
||||||
cDisplayMode = APP.settings.data.gameListMode;
|
cDisplayMode = APP.settings.data.gameListMode;
|
||||||
|
|
||||||
// Grid options
|
// Grid options
|
||||||
switch (cDisplayMode) {
|
switch (cDisplayMode){
|
||||||
|
|
||||||
case 'normal':
|
case 'normal':
|
||||||
document.getElementById('RANGE_settingsGridIconSize').disabled = 'disabled';
|
document.getElementById('RANGE_settingsGridIconSize').disabled = 'disabled';
|
||||||
|
@ -713,13 +713,11 @@ temp_DESIGN = {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset display modes
|
// Reset display modes and update zoom scale
|
||||||
this.gameListDisplayModes.forEach(function(cMode){
|
this.gameListDisplayModes.forEach(function(cMode){
|
||||||
document.getElementById('BTN_displayMode_' + cMode).disabled = '';
|
document.getElementById(`BTN_displayMode_${cMode}`).disabled = '';
|
||||||
});
|
});
|
||||||
document.getElementById('BTN_displayMode_' + cDisplayMode).disabled = 'disabled';
|
document.getElementById(`BTN_displayMode_${cDisplayMode}`).disabled = 'disabled';
|
||||||
|
|
||||||
// Update zoom scale
|
|
||||||
document.body.style.zoom = guiZoomScale;
|
document.body.style.zoom = guiZoomScale;
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
|
@ -19,16 +19,12 @@ temp_EMUMANAGER = {
|
||||||
// Run emu
|
// Run emu
|
||||||
runGame: function(){
|
runGame: function(){
|
||||||
|
|
||||||
// Get selected game details
|
// Get selected game details and check if user selected a game
|
||||||
const mainGameData = APP.gameList.list[APP.gameList.selectedGame];
|
const mainGameData = APP.gameList.list[APP.gameList.selectedGame];
|
||||||
|
|
||||||
// If user selected a game
|
|
||||||
if (mainGameData !== void 0){
|
if (mainGameData !== void 0){
|
||||||
|
|
||||||
// Reset Error List
|
// Reset Error List and clear log on emu running (if needed)
|
||||||
APP.emuManager.emuErrorList = [];
|
APP.emuManager.emuErrorList = [];
|
||||||
|
|
||||||
// Options: Clear log on emu starts
|
|
||||||
if (APP.settings.data.clearLogOnEmuLoad === !0 && APP.emuManager.emuRunCounter !== 0){
|
if (APP.settings.data.clearLogOnEmuLoad === !0 && APP.emuManager.emuRunCounter !== 0){
|
||||||
APP.clearLog(!0);
|
APP.clearLog(!0);
|
||||||
}
|
}
|
||||||
|
@ -47,7 +43,7 @@ temp_EMUMANAGER = {
|
||||||
|
|
||||||
// Get enabled hacks
|
// Get enabled hacks
|
||||||
hList.forEach(function(hackName){
|
hList.forEach(function(hackName){
|
||||||
if (document.getElementById('CHECK_' + hackName).checked === !0){
|
if (document.getElementById(`CHECK_${hackName}`).checked === !0){
|
||||||
emuArgs.push('-h');
|
emuArgs.push('-h');
|
||||||
emuArgs.push(hackName);
|
emuArgs.push(hackName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,6 +92,7 @@ temp_FILEMANAGER = {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open save dialog
|
||||||
TMS.triggerClick('APP_FILE_SAVE');
|
TMS.triggerClick('APP_FILE_SAVE');
|
||||||
|
|
||||||
},
|
},
|
||||||
|
@ -99,8 +100,18 @@ temp_FILEMANAGER = {
|
||||||
// Open game folder
|
// Open game folder
|
||||||
openDir: function(path){
|
openDir: function(path){
|
||||||
|
|
||||||
// Spawn explorer
|
// Switch platform
|
||||||
APP.childProcess.exec(`start "" "${path}"`);
|
switch (APP.os.platform()){
|
||||||
|
|
||||||
|
case 'win32':
|
||||||
|
APP.childProcess.exec(`start "" "${path}"`);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'linux':
|
||||||
|
APP.childProcess.exec(`browse "${path}"`);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ temp_GAMELIST = {
|
||||||
|
|
||||||
// Write file
|
// Write file
|
||||||
try {
|
try {
|
||||||
APP.fs.writeFileSync(data.path, JSON.stringify(gameSettings), 'utf8');
|
APP.fs.writeFileSync(data.path, JSON.stringify(gameSettings), 'utf-8');
|
||||||
logMessage = APP.lang.getVariable('createdSettingsFile', [data.name]);
|
logMessage = APP.lang.getVariable('createdSettingsFile', [data.name]);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
|
@ -87,7 +87,7 @@ temp_GAMELIST = {
|
||||||
// Write file
|
// Write file
|
||||||
try {
|
try {
|
||||||
|
|
||||||
APP.fs.writeFileSync(fPath, JSON.stringify(tempData), 'utf8');
|
APP.fs.writeFileSync(fPath, JSON.stringify(tempData), 'utf-8');
|
||||||
logMessage = APP.lang.getVariable('updateGameSettings', [APP.gameList.selectedGame]);
|
logMessage = APP.lang.getVariable('updateGameSettings', [APP.gameList.selectedGame]);
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -156,6 +156,7 @@ temp_GAMELIST = {
|
||||||
|
|
||||||
if (this.selectedGame !== ''){
|
if (this.selectedGame !== ''){
|
||||||
|
|
||||||
|
// Create main vars
|
||||||
var logMessage = '',
|
var logMessage = '',
|
||||||
cGame = this.selectedGame;
|
cGame = this.selectedGame;
|
||||||
|
|
||||||
|
@ -213,11 +214,13 @@ temp_GAMELIST = {
|
||||||
document.getElementById('INPUT_gameListSearch').value = '';
|
document.getElementById('INPUT_gameListSearch').value = '';
|
||||||
const gList = APP.fs.readdirSync(APP.settings.data.gamePath);
|
const gList = APP.fs.readdirSync(APP.settings.data.gamePath);
|
||||||
|
|
||||||
|
// Check if game list isn't empty
|
||||||
if (gList.length > 0){
|
if (gList.length > 0){
|
||||||
|
|
||||||
// Process game list
|
// Process game list
|
||||||
gList.forEach(function(gPath){
|
gList.forEach(function(gPath){
|
||||||
|
|
||||||
|
// Create main vars
|
||||||
var appBg,
|
var appBg,
|
||||||
appIcon,
|
appIcon,
|
||||||
addGame = !0,
|
addGame = !0,
|
||||||
|
@ -307,6 +310,7 @@ temp_GAMELIST = {
|
||||||
// If executable exists, set data
|
// If executable exists, set data
|
||||||
if (addGame === !0){
|
if (addGame === !0){
|
||||||
|
|
||||||
|
// Create metadata
|
||||||
const metadata = {
|
const metadata = {
|
||||||
bg: appBg,
|
bg: appBg,
|
||||||
name: appName,
|
name: appName,
|
||||||
|
@ -351,6 +355,7 @@ temp_GAMELIST = {
|
||||||
// Process search list
|
// Process search list
|
||||||
search: function(){
|
search: function(){
|
||||||
|
|
||||||
|
// Create main search vars
|
||||||
var gameListArray = Object.keys(APP.gameList.list),
|
var gameListArray = Object.keys(APP.gameList.list),
|
||||||
searchQuery = document.getElementById('INPUT_gameListSearch').value;
|
searchQuery = document.getElementById('INPUT_gameListSearch').value;
|
||||||
|
|
||||||
|
@ -437,10 +442,10 @@ temp_GAMELIST = {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check if playgo-chunk.dat exists
|
// Check if playgo-chunk.dat exists
|
||||||
if (APP.fs.existsSync(gPath + '/sce_sys/playgo-chunk.dat') !== !0){
|
if (APP.fs.existsSync(`${gPath}/sce_sys/playgo-chunk.dat`) !== !0){
|
||||||
cGameStatus = 'WARN';
|
|
||||||
|
|
||||||
// Check if playgo-chunk.dat is inside app folder
|
// Set current game status to warn and check if playgo-chunk.dat is inside app folder
|
||||||
|
cGameStatus = 'WARN';
|
||||||
if (APP.fs.existsSync(`${gPath}/sce_sys/app/playgo-chunk.dat`) === !0){
|
if (APP.fs.existsSync(`${gPath}/sce_sys/app/playgo-chunk.dat`) === !0){
|
||||||
APP.fs.copyFileSync(`${gPath}/sce_sys/app/playgo-chunk.dat`, `${gPath}/sce_sys/playgo-chunk.dat`);
|
APP.fs.copyFileSync(`${gPath}/sce_sys/app/playgo-chunk.dat`, `${gPath}/sce_sys/playgo-chunk.dat`);
|
||||||
APP.log(APP.lang.getVariable('checkDumpPlayGoOnApp', [this.list[this.selectedGame].name]));
|
APP.log(APP.lang.getVariable('checkDumpPlayGoOnApp', [this.list[this.selectedGame].name]));
|
||||||
|
@ -465,6 +470,7 @@ temp_GAMELIST = {
|
||||||
// Open selected game location
|
// Open selected game location
|
||||||
openGameLocation: function(){
|
openGameLocation: function(){
|
||||||
|
|
||||||
|
// Check if there's game selected
|
||||||
if (this.selectedGame !== ''){
|
if (this.selectedGame !== ''){
|
||||||
APP.fileManager.openDir(`${APP.settings.data.gamePath}/${this.list[this.selectedGame].folderName}`);
|
APP.fileManager.openDir(`${APP.settings.data.gamePath}/${this.list[this.selectedGame].folderName}`);
|
||||||
}
|
}
|
||||||
|
@ -504,7 +510,7 @@ temp_GAMELIST = {
|
||||||
APP.gameList.selectedGame = '';
|
APP.gameList.selectedGame = '';
|
||||||
APP.gameList.load();
|
APP.gameList.load();
|
||||||
APP.design.selectGame(cGame);
|
APP.design.selectGame(cGame);
|
||||||
TMS.scrollCenter('GAME_ENTRY_' + cGame);
|
TMS.scrollCenter(`GAME_ENTRY_${cGame}`);
|
||||||
}, 50);
|
}, 50);
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
@ -72,9 +72,8 @@ temp_PARAMSFO_PARSER = {
|
||||||
// Get key table data info
|
// Get key table data info
|
||||||
listAttrArray.forEach(function(cAttr){
|
listAttrArray.forEach(function(cAttr){
|
||||||
|
|
||||||
// Slice Current Data
|
// Slice current data and set current read mode
|
||||||
const cReadingMode = hexStartLocation.slice(readerLocation, parseInt(readerLocation + 32));
|
const cReadingMode = hexStartLocation.slice(readerLocation, parseInt(readerLocation + 32));
|
||||||
|
|
||||||
readMode[cAttr] = {
|
readMode[cAttr] = {
|
||||||
|
|
||||||
keyTableOffset: cReadingMode.slice(0, 4), // Key table offset
|
keyTableOffset: cReadingMode.slice(0, 4), // Key table offset
|
||||||
|
@ -91,7 +90,7 @@ temp_PARAMSFO_PARSER = {
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set Metadata Info
|
Set metadata info
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Set location to data table start create first slice
|
// Set location to data table start create first slice
|
||||||
|
@ -104,7 +103,6 @@ temp_PARAMSFO_PARSER = {
|
||||||
// Get hex file starting from current location
|
// Get hex file starting from current location
|
||||||
var keyData = '',
|
var keyData = '',
|
||||||
convertUft8 = !1,
|
convertUft8 = !1,
|
||||||
cSlice = dataTableSlice.slice(pointerLocation),
|
|
||||||
stopLocation = parseInt(pointerLocation + 8); // Default: int32
|
stopLocation = parseInt(pointerLocation + 8); // Default: int32
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -27,7 +27,6 @@ temp_SETTINGS = {
|
||||||
nwPath: '',
|
nwPath: '',
|
||||||
emuPath: '',
|
emuPath: '',
|
||||||
gamePath: '',
|
gamePath: '',
|
||||||
emuWinePath: '',
|
|
||||||
|
|
||||||
// Run fpPS4 on fullscreen
|
// Run fpPS4 on fullscreen
|
||||||
enableEmuFullscreen: !1,
|
enableEmuFullscreen: !1,
|
||||||
|
@ -106,10 +105,8 @@ temp_SETTINGS = {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// Read settings file
|
// Read settings file and check for obsolete keys
|
||||||
var loadSettings = JSON.parse(APP.fs.readFileSync(settingsPath, 'utf8'));
|
var loadSettings = JSON.parse(APP.fs.readFileSync(settingsPath, 'utf8'));
|
||||||
|
|
||||||
// Check for obsolete settings
|
|
||||||
Object.keys(loadSettings).forEach(function(cSettings){
|
Object.keys(loadSettings).forEach(function(cSettings){
|
||||||
|
|
||||||
if (APP.settings.data[cSettings] === void 0){
|
if (APP.settings.data[cSettings] === void 0){
|
||||||
|
@ -155,7 +152,7 @@ temp_SETTINGS = {
|
||||||
this.data.launcherVersion = APP.packageJson.version;
|
this.data.launcherVersion = APP.packageJson.version;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
APP.fs.writeFileSync(`${nwPath}/Settings.json`, JSON.stringify(this.data), 'utf8');
|
APP.fs.writeFileSync(`${nwPath}/Settings.json`, JSON.stringify(this.data), 'utf-8');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(APP.lang.getVariable('settingsSaveError', [err]));
|
console.error(APP.lang.getVariable('settingsSaveError', [err]));
|
||||||
}
|
}
|
||||||
|
@ -175,7 +172,7 @@ temp_SETTINGS = {
|
||||||
if (cLang !== 'english' && APP.fs.existsSync(fileLocation) === !0){
|
if (cLang !== 'english' && APP.fs.existsSync(fileLocation) === !0){
|
||||||
|
|
||||||
// Get selected lang
|
// Get selected lang
|
||||||
var getLangFile = APP.fs.readFileSync(fileLocation, 'utf8');
|
var getLangFile = APP.fs.readFileSync(fileLocation, 'utf-8');
|
||||||
APP.lang.selected = JSON.parse(getLangFile);
|
APP.lang.selected = JSON.parse(getLangFile);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -199,6 +196,7 @@ temp_SETTINGS = {
|
||||||
// Check paths
|
// Check paths
|
||||||
checkPaths: function(){
|
checkPaths: function(){
|
||||||
|
|
||||||
|
// Create main vars
|
||||||
var logMessage = '',
|
var logMessage = '',
|
||||||
mainPath = this.data.nwPath,
|
mainPath = this.data.nwPath,
|
||||||
pathList = ['/Emu', '/Games', '/Lang'];
|
pathList = ['/Emu', '/Games', '/Lang'];
|
||||||
|
@ -233,7 +231,6 @@ temp_SETTINGS = {
|
||||||
|
|
||||||
// Set flag to skip update check on window.onload
|
// Set flag to skip update check on window.onload
|
||||||
APP.emuManager.update.skipLoadingCheck = !0;
|
APP.emuManager.update.skipLoadingCheck = !0;
|
||||||
|
|
||||||
this.data.latestCommitSha = '';
|
this.data.latestCommitSha = '';
|
||||||
APP.emuManager.update.check();
|
APP.emuManager.update.check();
|
||||||
|
|
||||||
|
@ -243,8 +240,6 @@ temp_SETTINGS = {
|
||||||
if (this.data.latestCommitSha !== ''){
|
if (this.data.latestCommitSha !== ''){
|
||||||
APP.log(APP.lang.getVariable('settingsLogEmuSha', [APP.settings.data.latestCommitSha.slice(0, 7)]));
|
APP.log(APP.lang.getVariable('settingsLogEmuSha', [APP.settings.data.latestCommitSha.slice(0, 7)]));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log message
|
|
||||||
APP.log(logMessage);
|
APP.log(logMessage);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
|
@ -41,7 +41,7 @@ temp_TOOLS = {
|
||||||
|
|
||||||
var textValue = '';
|
var textValue = '';
|
||||||
if (hex !== void 0 && hex !== ''){
|
if (hex !== void 0 && hex !== ''){
|
||||||
textValue = decodeURIComponent('%' + hex.match(/.{2,2}/g).join('%'));
|
textValue = decodeURIComponent(`%${hex.match(/.{2,2}/g).join('%')}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return textValue;
|
return textValue;
|
||||||
|
|
|
@ -170,7 +170,6 @@ temp_EMU_UPDATE = {
|
||||||
artifactData,
|
artifactData,
|
||||||
canPrompt = !0,
|
canPrompt = !0,
|
||||||
canUpdate = !1,
|
canUpdate = !1,
|
||||||
latestCommit = '',
|
|
||||||
msgMode = 'confirm',
|
msgMode = 'confirm',
|
||||||
settingsData = APP.settings.data;
|
settingsData = APP.settings.data;
|
||||||
|
|
||||||
|
@ -181,10 +180,8 @@ temp_EMU_UPDATE = {
|
||||||
const cRun = options.runs.workflow_runs[i];
|
const cRun = options.runs.workflow_runs[i];
|
||||||
if (cRun.status === 'completed' && cRun.conclusion === 'success' && cRun.head_branch === settingsData.fpps4BranchName){
|
if (cRun.status === 'completed' && cRun.conclusion === 'success' && cRun.head_branch === settingsData.fpps4BranchName){
|
||||||
|
|
||||||
// Set can update on
|
// Set canUpdate on and run info
|
||||||
canUpdate = !0;
|
canUpdate = !0;
|
||||||
|
|
||||||
// Set run info
|
|
||||||
artifactData = {
|
artifactData = {
|
||||||
artifact: cRun.id,
|
artifact: cRun.id,
|
||||||
sha: cRun.head_sha
|
sha: cRun.head_sha
|
||||||
|
@ -256,11 +253,9 @@ temp_EMU_UPDATE = {
|
||||||
// If (by some reason) fpPS4 is running - close it!
|
// If (by some reason) fpPS4 is running - close it!
|
||||||
APP.emuManager.killEmu();
|
APP.emuManager.killEmu();
|
||||||
|
|
||||||
// Display GUI
|
// Display GUI and start download
|
||||||
APP.design.toggleEmuUpdateGUI('show');
|
APP.design.toggleEmuUpdateGUI('show');
|
||||||
APP.design.updateProgressbarStatus(25, APP.lang.getVariable('updateEmu-1-4', [actionsData.sha.slice(0, 7)]));
|
APP.design.updateProgressbarStatus(25, APP.lang.getVariable('updateEmu-1-4', [actionsData.sha.slice(0, 7)]));
|
||||||
|
|
||||||
// Start download
|
|
||||||
fetch(`https://nightly.link/red-prig/fpPS4/actions/runs/${actionsData.artifact}/fpPS4.zip`).then(function(resp){
|
fetch(`https://nightly.link/red-prig/fpPS4/actions/runs/${actionsData.artifact}/fpPS4.zip`).then(function(resp){
|
||||||
|
|
||||||
if (resp.ok === !0){
|
if (resp.ok === !0){
|
||||||
|
@ -319,10 +314,8 @@ temp_EMU_UPDATE = {
|
||||||
// Finish process
|
// Finish process
|
||||||
finish: function(data){
|
finish: function(data){
|
||||||
|
|
||||||
// Update status
|
// Update status, remove download file and update settings
|
||||||
APP.design.updateProgressbarStatus(75, APP.lang.getVariable('updateEmu-3-4'));
|
APP.design.updateProgressbarStatus(75, APP.lang.getVariable('updateEmu-3-4'));
|
||||||
|
|
||||||
// Remove download file and update settings
|
|
||||||
APP.fs.unlinkSync(data.path);
|
APP.fs.unlinkSync(data.path);
|
||||||
APP.settings.data.latestCommitSha = data.actions.sha;
|
APP.settings.data.latestCommitSha = data.actions.sha;
|
||||||
APP.settings.data.emuPath = `${APP.path.parse(data.path).dir}/fpPS4.exe`;
|
APP.settings.data.emuPath = `${APP.path.parse(data.path).dir}/fpPS4.exe`;
|
||||||
|
|
4
Launcher.sh
Normal file → Executable file
4
Launcher.sh
Normal file → Executable file
|
@ -1,3 +1,3 @@
|
||||||
clear
|
clear
|
||||||
./Nwjs/nw ../
|
./Nwjs/nw .
|
||||||
exit
|
exit
|
23
README.md
23
README.md
|
@ -1,22 +1,29 @@
|
||||||
# fpPS4 Temmie's Launcher
|
<h1 align="center">
|
||||||
Created by TheMitoSan _(Previously known as TemmieHeartz)_, This is a simple launcher created for [fpPS4](https://github.com/red-prig/fpPS4/) project.
|
<img src="App/img/logo.png" width="200" alt="fpPS4_TL_Logo"><br>
|
||||||
|
fpPS4 Temmie's Launcher
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
Created by TheMitoSan _(Previously known as TemmieHeartz)_, This is a simple launcher created for [fpPS4](https://github.com/red-prig/fpPS4) compatibility layer.
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="App/img/banner.jpg" width="750">
|
<img src="App/img/banner.jpg" width="750">
|
||||||
</p>
|
</p><br>
|
||||||
|
|
||||||
## How to install
|
## How to install
|
||||||
- Download / Clone this repo
|
|
||||||
|
- [Download / Clone this repo](https://github.com/themitosan/fpPS4-Temmie-s-Launcher/archive/refs/heads/main.zip)
|
||||||
- Download [nw.js](https://dl.nwjs.io/v0.70.1/nwjs-sdk-v0.70.1-win-x64.zip) version `0.70.1`
|
- Download [nw.js](https://dl.nwjs.io/v0.70.1/nwjs-sdk-v0.70.1-win-x64.zip) version `0.70.1`
|
||||||
- Extract all files from nw to the `Nwjs` folder
|
- Extract all files from `nw` on `Nwjs` folder
|
||||||
- Run `Launcher.bat`
|
- Run `Launcher.bat`
|
||||||
|
|
||||||
### How to setup fpPS4 and launcher
|
### How to Setup fpPS4 and launcher
|
||||||
You can setup both launcher and emulator using [this tutorial](https://docs.google.com/document/d/1HHRm9939HL7b8XCBagIyBo1VJIDj7Me4/edit).
|
You can setup both launcher and emulator using [this tutorial](https://docs.google.com/document/d/1HHRm9939HL7b8XCBagIyBo1VJIDj7Me4/edit).
|
||||||
|
|
||||||
## External plugins used on this project
|
## External plugins used on this project
|
||||||
- [memoryjs](https://github.com/rob--/memoryjs) - created by [Rob--](https://github.com/rob--)
|
- [memoryjs](https://github.com/rob--/memoryjs) - created by [Rob--](https://github.com/rob--)
|
||||||
- [node-stream-zip](https://github.com/antelle/node-stream-zip) - created by [antelle](https://github.com/antelle)
|
- [node-stream-zip](https://github.com/antelle/node-stream-zip) - created by [antelle](https://github.com/antelle)
|
||||||
- [TMS.js](https://github.com/themitosan/TMS.js) by [TheMitoSan](https://github.com/themitosan/) <sup><i>(Hi!)</i></sup>
|
- [TMS.js](https://github.com/themitosan/TMS.js) by [TheMitoSan](https://github.com/themitosan/) <sup>*(Hi!)*</sup>
|
||||||
|
|
||||||
<u><i><b>IMPORTANT</b>: This software does not allow you to obtain free PS4 Games / Apps.</i></u>
|
<u>
|
||||||
|
**IMPORTANT**: This software does not allow you to obtain free PS4 Games / Apps.
|
||||||
|
</u>
|
Loading…
Reference in a new issue