idxtable和cmdtable的location算错了

This commit is contained in:
root 2022-12-29 15:48:51 +08:00
parent 2894a7bcea
commit 9e00fb294c
2 changed files with 14 additions and 13 deletions

Binary file not shown.

View File

@ -195,10 +195,11 @@ const assembleCheat = (list, dup, hole) => {
const pack = (entlist, strlist, idxlist, cmdlist, xvalue) => { const pack = (entlist, strlist, idxlist, cmdlist, xvalue) => {
const align = (n, base) => base * Math.floor( (n+base-1) / base ); const align = (n, base) => base * Math.floor( (n+base-1) / base );
const strbase = 2 + entlist.length * 4 * 3; const entrysize = entlist[0].buffer.byteLength;
const idxbase = strbase + strlist.length; const strbase = 2 + entlist.length * entrysize;
const cmdbase = idxbase + idxlist.length * 2; const idxbase = strbase + strlist.buffer.byteLength;
const size = cmdbase + cmdlist.length*4; const cmdbase = idxbase + idxlist.buffer.byteLength;
const size = cmdbase + cmdlist.buffer.byteLength;;
let result = new ArrayBuffer( align(size, 32) ); let result = new ArrayBuffer( align(size, 32) );
// entry count // entry count
@ -207,7 +208,7 @@ const pack = (entlist, strlist, idxlist, cmdlist, xvalue) => {
// entry data // entry data
entlist.forEach( (entry,index) => { entlist.forEach( (entry,index) => {
let offset = 2 + index*4*3; let offset = 2 + index*entrysize;
view.setUint32( offset, entry[0], true ); view.setUint32( offset, entry[0], true );
view.setUint32( offset+4, entry[1] + (entry[0] > 0xffff ? cmdbase : idxbase), true ); view.setUint32( offset+4, entry[1] + (entry[0] > 0xffff ? cmdbase : idxbase), true );
view.setUint32( offset+8, entry[2], true ); view.setUint32( offset+8, entry[2], true );
@ -218,11 +219,11 @@ const pack = (entlist, strlist, idxlist, cmdlist, xvalue) => {
strings.set( strlist, 0 ); strings.set( strlist, 0 );
// indexes table // indexes table
let indexes = new Uint8Array( result, idxbase, idxlist.length*2 ); let indexes = new Uint8Array( result, idxbase, idxlist.buffer.byteLength );
indexes.set( new Uint8Array(idxlist.buffer), 0 ); indexes.set( new Uint8Array(idxlist.buffer), 0 );
// instruction table // instruction table
let commands = new Uint8Array( result, cmdbase, cmdlist.length*4 ); let commands = new Uint8Array( result, cmdbase, cmdlist.buffer.byteLength );
commands.set( new Uint8Array(cmdlist.buffer), 0 ); commands.set( new Uint8Array(cmdlist.buffer), 0 );
return { id: xvalue, bin: new Uint8Array( result ) }; return { id: xvalue, bin: new Uint8Array( result ) };
@ -288,19 +289,19 @@ const lade = (list, info, order) => {
if( list.length == 0 ) return 0; if( list.length == 0 ) return 0;
if( strtable.length > 0xffff ) throw new RangeError(`string table is too big.`); if( strtable.length > 0xffff ) throw new RangeError(`string table is too big.`);
let ret = idxtable.length; let ret = idxtable.buffer.byteLength;
let nt = new Uint16Array( ret + list.length ); let nt = new Uint16Array( idxtable.length + list.length );
nt.set( idxtable, 0 ); nt.set( idxtable, 0 );
nt.set( list, ret ); nt.set( list, idxtable.length );
idxtable = nt; idxtable = nt;
return ret; return ret;
} }
const addCommand = list => { const addCommand = list => {
let ret = cmdtable.length; let ret = cmdtable.buffer.byteLength;
let nt = new Uint32Array( ret + list.length ); let nt = new Uint32Array( cmdtable.length + list.length );
nt.set( cmdtable, 0 ); nt.set( cmdtable, 0 );
nt.set( list, ret ); nt.set( list, cmdtable.length );
cmdtable = nt; cmdtable = nt;
return ret; return ret;
} }