mirror of
https://github.com/marcrobledo/RomPatcher.js.git
synced 2025-06-27 16:25:54 +00:00
added language selector, looks like Chrome wasn't compatible with automatic detection
This commit is contained in:
parent
fb00500f23
commit
008ba151ed
5 changed files with 190 additions and 20 deletions
|
@ -29,7 +29,7 @@ caches.keys().then(function(cacheNames){
|
||||||
});
|
});
|
||||||
|
|
||||||
var PRECACHE_ID='rom-patcher-js';
|
var PRECACHE_ID='rom-patcher-js';
|
||||||
var PRECACHE_VERSION='v11';
|
var PRECACHE_VERSION='v12';
|
||||||
var PRECACHE_URLS=[
|
var PRECACHE_URLS=[
|
||||||
'/RomPatcher.js/','/RomPatcher.js/index.html',
|
'/RomPatcher.js/','/RomPatcher.js/index.html',
|
||||||
'/RomPatcher.js/manifest.json',
|
'/RomPatcher.js/manifest.json',
|
||||||
|
|
15
index.html
15
index.html
|
@ -111,7 +111,7 @@
|
||||||
<div class="row" id="row-addheader" style="display:none">
|
<div class="row" id="row-addheader" style="display:none">
|
||||||
<div class="leftcol"></div>
|
<div class="leftcol"></div>
|
||||||
<div class="rightcol">
|
<div class="rightcol">
|
||||||
<input type="checkbox" id="checkbox-addheader" /> <label for="checkbox-addheader" data-localize="add_header">Add temporary header:</label> <small>(<label id="headersize" for="checkbox-addheader"></label>)</small>
|
<input type="checkbox" id="checkbox-addheader" /> <label for="checkbox-addheader" data-localize="add_header">Add temporary header</label> <small>(<label id="headersize" for="checkbox-addheader"></label>)</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -166,14 +166,23 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="snackbar" class="closed"></div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- FOOTER -->
|
<!-- FOOTER -->
|
||||||
<footer>
|
<footer>
|
||||||
Rom Patcher JS <small>v2.3b</small> by <a href="/">Marc Robledo</a>
|
<div>
|
||||||
|
<select id="select-language" onchange="setLanguage(this.value)">
|
||||||
|
<option value="en">English</option>
|
||||||
|
<option value="de">Deutsch</option>
|
||||||
|
<option value="es">Español</option>
|
||||||
|
<option value="ca">Català</option>
|
||||||
|
<option value="ru">Russian</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Rom Patcher JS <small>v2.4</small> by <a href="/">Marc Robledo</a>
|
||||||
<br />
|
<br />
|
||||||
<i class="icon github"></i> <a href="https://github.com/marcrobledo/RomPatcher.js/" target="_blank">See on GitHub</a>
|
<i class="icon github"></i> <a href="https://github.com/marcrobledo/RomPatcher.js/" target="_blank">See on GitHub</a>
|
||||||
<i class="icon heart"></i> <a href="https://www.paypal.me/marcrobledo/5" target="_blank" rel="nofollow">Donate</a>
|
<i class="icon heart"></i> <a href="https://www.paypal.me/marcrobledo/5" target="_blank" rel="nofollow">Donate</a>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Rom Patcher JS v20200915 - Marc Robledo 2016-2020 - http://www.marcrobledo.com/license */
|
/* Rom Patcher JS v20201106 - Marc Robledo 2016-2020 - http://www.marcrobledo.com/license */
|
||||||
|
|
||||||
const TOO_BIG_ROM_SIZE=67108863;
|
const TOO_BIG_ROM_SIZE=67108863;
|
||||||
const HEADERS_INFO=[
|
const HEADERS_INFO=[
|
||||||
|
@ -176,6 +176,23 @@ function _parseROM(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function setLanguage(langCode){
|
||||||
|
if(typeof LOCALIZATION[langCode]==='undefined')
|
||||||
|
langCode='en';
|
||||||
|
|
||||||
|
userLanguage=LOCALIZATION[langCode];
|
||||||
|
|
||||||
|
var translatableElements=document.querySelectorAll('*[data-localize]');
|
||||||
|
for(var i=0; i<translatableElements.length; i++){
|
||||||
|
translatableElements[i].innerHTML=_(translatableElements[i].dataset.localize);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(typeof localStorage!=='undefined'){
|
||||||
|
localStorage.setItem('rompatcher-js-lang', langCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* initialize app */
|
/* initialize app */
|
||||||
addEvent(window,'load',function(){
|
addEvent(window,'load',function(){
|
||||||
/* zip-js web worker */
|
/* zip-js web worker */
|
||||||
|
@ -192,15 +209,11 @@ addEvent(window,'load',function(){
|
||||||
|
|
||||||
/* language */
|
/* language */
|
||||||
var langCode=(navigator.language || navigator.userLanguage).substr(0,2);
|
var langCode=(navigator.language || navigator.userLanguage).substr(0,2);
|
||||||
if(typeof LOCALIZATION[langCode]==='object'){
|
if(typeof localStorage!=='undefined' && localStorage.getItem('rompatcher-js-lang'))
|
||||||
userLanguage=LOCALIZATION[langCode];
|
langCode=localStorage.getItem('rompatcher-js-lang');
|
||||||
}else{
|
el('select-language').value=langCode;
|
||||||
userLanguage=LOCALIZATION.en;
|
setLanguage(langCode);
|
||||||
}
|
|
||||||
var translatableElements=document.querySelectorAll('*[data-localize]');
|
|
||||||
for(var i=0; i<translatableElements.length; i++){
|
|
||||||
translatableElements[i].innerHTML=_(translatableElements[i].dataset.localize);
|
|
||||||
}
|
|
||||||
|
|
||||||
el('row-file-patch').title=_('compatible_formats')+' IPS, UPS, APS, BPS, RUP, PPF, MOD (Paper Mario Star Rod), xdelta';
|
el('row-file-patch').title=_('compatible_formats')+' IPS, UPS, APS, BPS, RUP, PPF, MOD (Paper Mario Star Rod), xdelta';
|
||||||
|
|
||||||
|
@ -437,9 +450,22 @@ function preparePatchedRom(originalRom, patchedRom, headerSize){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* fix checksum if needed */
|
||||||
|
//var fixedChecksum=fixConsoleChecksum(patchedRom);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
setMessage('apply');
|
setMessage('apply');
|
||||||
patchedRom.save();
|
patchedRom.save();
|
||||||
|
|
||||||
|
|
||||||
|
/*if(fixedChecksum){
|
||||||
|
setMessage('apply','Checksum was fixed','warning');
|
||||||
|
}*/
|
||||||
|
|
||||||
//debug: create unheadered patch
|
//debug: create unheadered patch
|
||||||
/*if(headerSize && el('checkbox-addheader').checked){
|
/*if(headerSize && el('checkbox-addheader').checked){
|
||||||
createPatch(romFile, patchedRom);
|
createPatch(romFile, patchedRom);
|
||||||
|
|
129
js/crc.js
129
js/crc.js
|
@ -1,4 +1,4 @@
|
||||||
/* Rom Patcher JS - CRC32/MD5/SHA-1 calculators v20181017 - Marc Robledo 2016-2018 - http://www.marcrobledo.com/license */
|
/* Rom Patcher JS - CRC32/MD5/SHA-1/checksums calculators v20200926 - Marc Robledo 2016-2020 - http://www.marcrobledo.com/license */
|
||||||
|
|
||||||
function padZeroes(intVal, nBytes){
|
function padZeroes(intVal, nBytes){
|
||||||
var hexString=intVal.toString(16);
|
var hexString=intVal.toString(16);
|
||||||
|
@ -103,3 +103,130 @@ function adler32(marcFile, offset, len){
|
||||||
|
|
||||||
return ((b<<16) | a)>>>0;
|
return ((b<<16) | a)>>>0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* CRC16 */
|
||||||
|
/*
|
||||||
|
const CRC16_TABLE=(function(){
|
||||||
|
var c,crcTable=[];
|
||||||
|
for(var n=0;n<256;n++){
|
||||||
|
c=n;
|
||||||
|
for(var k=0;k<8;k++)
|
||||||
|
c=((c&1)?(0x8408^(c>>>1)):(c>>>1));
|
||||||
|
crcTable[n]=c;
|
||||||
|
}
|
||||||
|
return crcTable;
|
||||||
|
}());
|
||||||
|
function crc16(marcFile){
|
||||||
|
var crc=0^(-1);
|
||||||
|
|
||||||
|
for(var i=0;i<marcFile._u8array.length;i++)
|
||||||
|
crc=((crc>>>8)&0x0ff)^CRC16_TABLE[(crc^marcFile._u8array[i])&0xff];
|
||||||
|
|
||||||
|
return ((crc^(-1))>>>0) & 0xffff;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* specific ROM checksums */
|
||||||
|
/* this is unused code, might be used in a future so ROM checksums can be fixed after patching */
|
||||||
|
const CONSOLES=[
|
||||||
|
{
|
||||||
|
title:'Sega Mega Drive/Genesis',
|
||||||
|
MEGADRIVE_LOGO:[0x53, 0x45, 0x47, 0x41, 0x20, 0x4d, 0x45, 0x47, 0x41, 0x20, 0x44, 0x52],
|
||||||
|
GENESIS_LOGO:[0x53, 0x45, 0x47, 0x41, 0x20, 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53],
|
||||||
|
checkHeader:function(marcFile){
|
||||||
|
var megadrive=true;
|
||||||
|
var genesis=true;
|
||||||
|
for(var i=0; i<12 && (megadrive || genesis); i++){
|
||||||
|
if(marcFile._u8array[0x100+i]!==this.MEGADRIVE_LOGO[i])
|
||||||
|
megadrive=false;
|
||||||
|
if(marcFile._u8array[0x100+i]!==this.GENESIS_LOGO[i])
|
||||||
|
genesis=false;
|
||||||
|
}
|
||||||
|
return megadrive || genesis;
|
||||||
|
},
|
||||||
|
getChecksum:function(marcFile){
|
||||||
|
return (marcFile._u8array[0x018e]<<8) + marcFile._u8array[0x018f];
|
||||||
|
},
|
||||||
|
recalculateChecksum:function(marcFile){
|
||||||
|
var checksum=0;
|
||||||
|
|
||||||
|
for(var i=0x200; i<marcFile.fileSize; i+=2)
|
||||||
|
checksum=(checksum + (((marcFile._u8array[i]<<8) + marcFile._u8array[i+1])>>>0)) & 0xffff;
|
||||||
|
|
||||||
|
return checksum
|
||||||
|
},
|
||||||
|
updateChecksum:function(marcFile, newChecksum){
|
||||||
|
marcFile._u8array[0x18e]=newChecksum>>8;
|
||||||
|
marcFile._u8array[0x18f]=newChecksum & 0xff;
|
||||||
|
}
|
||||||
|
},{
|
||||||
|
title:'Game Boy',
|
||||||
|
NINTENDO_LOGO:[0xce, 0xed, 0x66, 0x66, 0xcc, 0x0d, 0x00, 0x0b, 0x03, 0x73, 0x00, 0x83, 0x00, 0x0c, 0x00, 0x0d],
|
||||||
|
checkHeader:function(marcFile){
|
||||||
|
for(var i=0; i<this.NINTENDO_LOGO.length; i++){
|
||||||
|
if(marcFile._u8array[0x104+i]!==this.NINTENDO_LOGO[i])
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
getChecksum:function(marcFile){
|
||||||
|
return marcFile._u8array[0x14d]
|
||||||
|
},
|
||||||
|
recalculateChecksum:function(marcFile){
|
||||||
|
var checksum=0;
|
||||||
|
|
||||||
|
for(var i=0x134; i<0x014d; i++){
|
||||||
|
checksum=(checksum - marcFile._u8array[i] - 1) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return checksum
|
||||||
|
},
|
||||||
|
updateChecksum:function(marcFile, newChecksum){
|
||||||
|
marcFile._u8array[0x014d]=newChecksum;
|
||||||
|
|
||||||
|
|
||||||
|
/* global checksum isn't checked by real hw, but fix it anyway */
|
||||||
|
var globalChecksumOld=(marcFile._u8array[0x014e]<<8) + marcFile._u8array[0x014f];
|
||||||
|
var globalChecksumNew=0;
|
||||||
|
for(var i=0x0000; i<0x014e; i++)
|
||||||
|
globalChecksumNew=((globalChecksumNew + marcFile._u8array[i]) >>> 0) & 0xffff;
|
||||||
|
for(i=0x0150;i<marcFile.fileSize; i++)
|
||||||
|
globalChecksumNew=((globalChecksumNew + marcFile._u8array[i]) >>> 0) & 0xffff;
|
||||||
|
if(globalChecksumOld!==globalChecksumNew){
|
||||||
|
marcFile._u8array[0x014e]=globalChecksumNew>>8;
|
||||||
|
marcFile._u8array[0x014f]=globalChecksumNew & 0xff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
function checkConsole(marcFile){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function fixConsoleChecksum(marcFile){
|
||||||
|
var system=false;
|
||||||
|
for(var i=0; i<CONSOLES.length && !system; i++)
|
||||||
|
if(CONSOLES[i].checkHeader(marcFile))
|
||||||
|
system=CONSOLES[i];
|
||||||
|
if(!system)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var oldChecksum=console.getChecksum(marcFile);
|
||||||
|
var newChecksum=console.recalculateChecksum(marcFile);
|
||||||
|
|
||||||
|
if(oldChecksum!==newChecksum)
|
||||||
|
if(alert('Fix '+console.title+' checksum?')){
|
||||||
|
console.updateChecksum(marcFile, newChecksum);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
|
@ -1,9 +1,9 @@
|
||||||
/* WebApps CSS template by Marc Robledo v20190531 */
|
/* WebApps CSS template by Marc Robledo v20191106 */
|
||||||
/* minify at https://cssminifier.com/ + https://www.base64-image.de/ */
|
/* minify at https://cssminifier.com/ + https://www.base64-image.de/ */
|
||||||
|
|
||||||
/* @FONT-FACES */
|
/* @FONT-FACES */
|
||||||
@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700');
|
@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700');
|
||||||
@import url(https://fonts.googleapis.com/css?family=Roboto+Mono:300);
|
@import url('https://fonts.googleapis.com/css?family=Roboto+Mono:300');
|
||||||
|
|
||||||
body{
|
body{
|
||||||
margin:0;
|
margin:0;
|
||||||
|
@ -52,7 +52,6 @@ footer{padding: 50px 0 20px}
|
||||||
|
|
||||||
|
|
||||||
/* icons */
|
/* icons */
|
||||||
|
|
||||||
footer .icon, #crc32.valid:after{
|
footer .icon, #crc32.valid:after{
|
||||||
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAQCAYAAABQrvyxAAACUElEQVRIx9XWzUtUURzG8atp04svtCiI3v6EQFIoInBREFgEQtC+VVCLWoQLMTKqRUEbU4uKaOht5a7IoDcoWkiLIKKVgqUUvkGMM2revid+V55u5+qdS5ANfEDvPXN4npl7zpkgDMMgpgFX8QEF8xG9aPKM/6f0n7W4ifkw+eXu5VG33Aq48G/C9K8B1EeTjLTsdrbjMQqYwn1sw2bkMYlp9GOHe89CiDNBuU5jAOujSe5KsFY8wVe8NaN4hsN4bWP7pIAL9B1hzGcMe667IjszFuhAaN65CfbIJ5tP8bVdl/F7rcBzT8ilvMxQ4JyEd9rdBHck0JUUBc7L+HtWoJShwEyswCasSghegUux8G2/7jHBoCzQDSkKuGd/1t4zZAVGMhQYlQLNmEA/1sTCV6JHgs/jxMJ9JihamEIZq3/M3lO0AmczFLggBYYloCuxWj753lj4Y78VZIJxeSQ2pgi/Dj9s/IQVqEZfGeEfIScFGjAmQZ+iDjfk2hyO/vF4McELKdCZokCbjH8l26gr8TBFeFc059lGXYlxCVyUv2dxxLs+mOC4hXkPt7AuYqsn+BYrOCcFTkkBpwq3Fwn/wIoGCedAIyZji3UGrYk7kx1ig1agXQLul/DNnsPsS3QiSwGnEt2e8LewQscmbKNN8k2UcGjRrdUm2YVp9OAgTqJKCuRi4UtWKvAUcCpwWcJ3WbEgRYHocRpCy5Jng4TcZ4vyk522NXJvpYSfwgF9vDwFIp1ut0m6/7d/zAW2C3XhG2rlerVdu2ZrYVn+Gv0v/QQllGUdmIg+uwAAAABJRU5ErkJggg==');
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAQCAYAAABQrvyxAAACUElEQVRIx9XWzUtUURzG8atp04svtCiI3v6EQFIoInBREFgEQtC+VVCLWoQLMTKqRUEbU4uKaOht5a7IoDcoWkiLIKKVgqUUvkGMM2revid+V55u5+qdS5ANfEDvPXN4npl7zpkgDMMgpgFX8QEF8xG9aPKM/6f0n7W4ifkw+eXu5VG33Aq48G/C9K8B1EeTjLTsdrbjMQqYwn1sw2bkMYlp9GOHe89CiDNBuU5jAOujSe5KsFY8wVe8NaN4hsN4bWP7pIAL9B1hzGcMe667IjszFuhAaN65CfbIJ5tP8bVdl/F7rcBzT8ilvMxQ4JyEd9rdBHck0JUUBc7L+HtWoJShwEyswCasSghegUux8G2/7jHBoCzQDSkKuGd/1t4zZAVGMhQYlQLNmEA/1sTCV6JHgs/jxMJ9JihamEIZq3/M3lO0AmczFLggBYYloCuxWj753lj4Y78VZIJxeSQ2pgi/Dj9s/IQVqEZfGeEfIScFGjAmQZ+iDjfk2hyO/vF4McELKdCZokCbjH8l26gr8TBFeFc059lGXYlxCVyUv2dxxLs+mOC4hXkPt7AuYqsn+BYrOCcFTkkBpwq3Fwn/wIoGCedAIyZji3UGrYk7kx1ig1agXQLul/DNnsPsS3QiSwGnEt2e8LewQscmbKNN8k2UcGjRrdUm2YVp9OAgTqJKCuRi4UtWKvAUcCpwWcJ3WbEgRYHocRpCy5Jng4TcZ4vyk522NXJvpYSfwgF9vDwFIp1ut0m6/7d/zAW2C3XhG2rlerVdu2ZrYVn+Gv0v/QQllGUdmIg+uwAAAABJRU5ErkJggg==');
|
||||||
}
|
}
|
||||||
|
@ -180,7 +179,16 @@ select::-ms-expand{display:none}
|
||||||
input[type=file].enabled:hover,select.enabled:hover{background-color:#dee1e1}
|
input[type=file].enabled:hover,select.enabled:hover{background-color:#dee1e1}
|
||||||
input[type=file].disabled,select.disabled{background-color:transparent}
|
input[type=file].disabled,select.disabled{background-color:transparent}
|
||||||
|
|
||||||
|
#select-language{
|
||||||
|
background-color:transparent;
|
||||||
|
color:white;
|
||||||
|
cursor:pointer;
|
||||||
|
background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJmaWxsOiNmZmYiIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+");
|
||||||
|
}
|
||||||
|
#select-language:hover{
|
||||||
|
background-color:#2b2e33;
|
||||||
|
cursor:pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -210,7 +218,7 @@ button.enabled:active{
|
||||||
transform:translateY(1px)
|
transform:translateY(1px)
|
||||||
}
|
}
|
||||||
button:disabled{opacity:.35 !important;cursor:not-allowed}
|
button:disabled{opacity:.35 !important;cursor:not-allowed}
|
||||||
button.close{color:white;background-color:#}
|
|
||||||
button.no-text.with-icon:before{margin-right:0px}
|
button.no-text.with-icon:before{margin-right:0px}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue