From 6562fe4fab9aa7347c983894f87bb1f756ed88d6 Mon Sep 17 00:00:00 2001 From: a92126 <182859762@qq.com> Date: Wed, 9 Oct 2024 14:50:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8D=E5=A4=84=E7=90=86=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=EF=BC=8C=E5=B0=86gameinfo=E5=88=86=E9=9A=94=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=94=BE=E5=88=B0parser=E4=B8=AD=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E4=BA=86=E4=BA=9B=E8=AE=B8=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/cheat-builder/build.js | 2 -- tools/cheat-builder/cht.js | 35 +++++++++++++++++++++++++++++------ tools/cheat-builder/worker.js | 27 +-------------------------- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/tools/cheat-builder/build.js b/tools/cheat-builder/build.js index d9b412a..5c7a010 100644 --- a/tools/cheat-builder/build.js +++ b/tools/cheat-builder/build.js @@ -1,5 +1,3 @@ -const readCht = require("./cht"); -const fs = require("fs"); const { readFile, writeFile } = require("fs/promises"); const transform = require("./worker"); diff --git a/tools/cheat-builder/cht.js b/tools/cheat-builder/cht.js index 919c6cf..52cb65e 100644 --- a/tools/cheat-builder/cht.js +++ b/tools/cheat-builder/cht.js @@ -34,15 +34,30 @@ const findIndex = (t, tr, tlen) => { } const read = (cht, info, order) => { - cht = cht.replace(/[-]{4,}/g, ""); const size = cht.length; let state = WAIT_LOCK, token = [], line = 1; let locks = [], currlock = null; - const token_str = () => { let r = String.fromCharCode.apply(String, token); return (token.length = 0, r); } + + const merge_str = String.fromCharCode.bind(String); + const token_str = () => { const r = merge_str.apply(null, token); return (token.length = 0, r); } const error = msg => { throw new SyntaxError(`${msg} at line: ${line} in lock ${currlock?.name}`) } + + const next_cht_begin = pos => { + for(let i=pos; i < size; ++i ){ + const ch = cht.charAt(i); + if (ch == "\n") { + ++line; + if(cht.charAt(i + 1) == "[") + return i; + } + } + return size; + } + + const retval = []; for (let i = 0; i <= size; ++i) { - const ch = i == size ? "" : cht.charAt(i); + const ch = cht.charAt(i); switch (ch) { case "[": if (state == WAIT_LOCK || state == READ_HOLE) { @@ -57,8 +72,16 @@ const read = (cht, info, order) => { state = WAIT_HOLE; currlock.name = token_str(); currlock.holes = []; - if (currlock.name.toLowerCase() == "gameinfo") - i = size; // break; + if (currlock.name.toLowerCase() == "gameinfo"){ + retval.push( lade(locks, info, order) ); + i = next_cht_begin(i); + if( i < size ){ + state = WAIT_LOCK; + token = []; + locks = []; + currlock = null; + } + } } else error(`error occur ] on ${STATE[state]}`) break; @@ -166,7 +189,7 @@ const read = (cht, info, order) => { break; } } - return lade(locks, info, order); + return retval; } const assembleCheat = (list, dup, hole) => { diff --git a/tools/cheat-builder/worker.js b/tools/cheat-builder/worker.js index 3339bb9..ed38115 100644 --- a/tools/cheat-builder/worker.js +++ b/tools/cheat-builder/worker.js @@ -3,29 +3,6 @@ const readCht = require("./cht"); const { readFile, access } = require("fs/promises"); const ncpu = require("os").availableParallelism(); -const trimcheat = (dat, info, order) => { - let parts = [], start = 0, done = false; - while (!done) { - let pos = dat.indexOf("[GameInfo]", start); - if (pos > 0) { - pos = dat.indexOf("[", pos + "[GameInfo]".length); - if (pos > 0) { - parts.push(dat.slice(start, pos)); - start = pos; - } - else { - parts.push(dat.slice(start, dat.length)); - done = true; - } - } - else { - parts.push(dat.slice(start, dat.length)); - done = true; - } - } - return parts.map(tr => readCht(tr, info, order)); -} - const loadcheat = async (order, serial, title, file) => { if( false == await access(file).catch( e => false ) ) { return Promise.resolve(); @@ -35,9 +12,7 @@ const loadcheat = async (order, serial, title, file) => { const chtfile = await readFile(file); const cheats = chtfile.toString("utf-8"); let cheat = null; - if (cheats.indexOf("[GameInfo]") != cheats.lastIndexOf("[GameInfo]")) - cheat = trimcheat(cheats, { serial }, order); - else cheat = [readCht(cheats, { serial }, order)]; + cheat = readCht(cheats, { serial }, order); return { serial, cheat } } catch (e) {