From 25d1e48b4978bcc848bef7d0080cea139d4645f8 Mon Sep 17 00:00:00 2001 From: sugoidogo Date: Sat, 22 Nov 2025 23:47:44 -0800 Subject: [PATCH] initial commit --- .gitignore | 1 + LICENCE.md | 157 ++++++++++++++++++++++++++++++++++++++++++++ README.md | 7 ++ SugoiFontOptions.js | 137 ++++++++++++++++++++++++++++++++++++++ package-lock.json | 61 +++++++++++++++++ package.json | 19 ++++++ tsconfig.json | 14 ++++ 7 files changed, 396 insertions(+) create mode 100644 .gitignore create mode 100644 LICENCE.md create mode 100644 README.md create mode 100644 SugoiFontOptions.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/LICENCE.md b/LICENCE.md new file mode 100644 index 0000000..6fb6a01 --- /dev/null +++ b/LICENCE.md @@ -0,0 +1,157 @@ +# GNU LESSER GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the +terms and conditions of version 3 of the GNU General Public License, +supplemented by the additional permissions listed below. + +## 0. Additional Definitions. + +As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the +GNU General Public License. + +"The Library" refers to a covered work governed by this License, other +than an Application or a Combined Work as defined below. + +An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + +A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + +The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + +The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +## 1. Exception to Section 3 of the GNU GPL. + +You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +## 2. Conveying Modified Versions. + +If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + +- a) under this License, provided that you make a good faith effort + to ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or +- b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + +## 3. Object Code Incorporating Material from Library Header Files. + +The object code form of an Application may incorporate material from a +header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + +- a) Give prominent notice with each copy of the object code that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the object code with a copy of the GNU GPL and this + license document. + +## 4. Combined Works. + +You may convey a Combined Work under terms of your choice that, taken +together, effectively do not restrict modification of the portions of +the Library contained in the Combined Work and reverse engineering for +debugging such modifications, if you also do each of the following: + +- a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the Combined Work with a copy of the GNU GPL and this + license document. +- c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. +- d) Do one of the following: + - 0) Convey the Minimal Corresponding Source under the terms of + this License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + - 1) Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (a) uses at run + time a copy of the Library already present on the user's + computer system, and (b) will operate properly with a modified + version of the Library that is interface-compatible with the + Linked Version. +- e) Provide Installation Information, but only if you would + otherwise be required to provide such information under section 6 + of the GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the Application + with a modified version of the Linked Version. (If you use option + 4d0, the Installation Information must accompany the Minimal + Corresponding Source and Corresponding Application Code. If you + use option 4d1, you must provide the Installation Information in + the manner specified by section 6 of the GNU GPL for conveying + Corresponding Source.) + +## 5. Combined Libraries. + +You may place library facilities that are a work based on the Library +side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + +- a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities, conveyed under the terms of this License. +- b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + +## 6. Revised Versions of the GNU Lesser General Public License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +as you received it specifies that a certain numbered version of the +GNU Lesser General Public License "or any later version" applies to +it, you have the option of following the terms and conditions either +of that published version or of any later version published by the +Free Software Foundation. If the Library as you received it does not +specify a version number of the GNU Lesser General Public License, you +may choose any version of the GNU Lesser General Public License ever +published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9bfc3c0 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Sugoi Font Override +Adds Font Overrides to Options +# Usage +Download the plugin from releases and put it in the plugins folder of your project. +Create an `alt_fonts` folder in your project folder and place your extra fonts inside. +Playtest the game, the plugin will generate an `alt_fonts/index.json` file for the web/mobile distro. +Your game will now have an extra option to allow the player to override the default font. \ No newline at end of file diff --git a/SugoiFontOptions.js b/SugoiFontOptions.js new file mode 100644 index 0000000..9b22b60 --- /dev/null +++ b/SugoiFontOptions.js @@ -0,0 +1,137 @@ +/*: + * @target MZ + * @plugindesc Adds Font Overrides to Options + * @author SugoiDogo + * @help SugoiFontSettings.js + * + * Adds Font Overrides to Options + * + * Create the folder alt_fonts in your project folder, + * add your fonts to that folder, and this plugin will + * add the option to override game fonts with alt fonts. + * Useful for accessibility fonts, etc. + */ +{ + const option_name = 'Font Override' + const font_symbol = 'font_override' + const disabled = 'disabled' + const alt_fonts = 'alt_fonts/' + const fonts_index = 'index.json' + const fonts = [disabled] + let font = fonts[0] + + if (require) { + const fs = require('fs') + fs.mkdirSync(alt_fonts,{recursive:true}) + const fontFileNames = fs.readdirSync(alt_fonts) + fs.writeFileSync(alt_fonts + fonts_index, JSON.stringify(fontFileNames)) + } + + fetch(encodeURI(alt_fonts + fonts_index)) + .then(response => response.json()) + .then(/** @type {string[]} */ fontFileNames => { + for (const fontFileName of fontFileNames) { + const fontName = fontFileName.split('.')[0] + const fontURL = encodeURI(alt_fonts + fontFileName) + // @ts-ignore FontManager is not documented + FontManager.startLoading(fontName, fontURL) + fonts.push(fontName) + } + }) + + const addGeneralOptions = Window_Options.prototype.addGeneralOptions + Window_Options.prototype.addGeneralOptions = function () { + addGeneralOptions.call(this); + this.addCommand(option_name, font_symbol, true) + } + + const statusText = Window_Options.prototype.statusText + Window_Options.prototype.statusText = function (/** @type {number} */ index) { + const symbol = this.commandSymbol(index) + if (symbol === font_symbol) { + return font + } + return statusText.call(this, index) + } + + function getNextFont(forward = true) { + let index = fonts.indexOf(font) + if (forward) { + index++ + } else { + index-- + } + index %= fonts.length + return fonts[index] + } + + const processOk = Window_Options.prototype.processOk + Window_Options.prototype.processOk = function () { + const index = this.index(); + const symbol = this.commandSymbol(index); + if (symbol === font_symbol) { + // @ts-ignore changeValue should have `value: any` + this.changeValue(font_symbol, getNextFont()) + } else { + return processOk.call(this) + } + } + + const cursorRight = Window_Options.prototype.cursorRight + Window_Options.prototype.cursorRight = function (/** @type {boolean} */ wrap) { + const index = this.index(); + const symbol = this.commandSymbol(index); + if (symbol === font_symbol) { + // @ts-ignore changeValue should have `value: any` + this.changeValue(font_symbol, getNextFont()) + } else { + return cursorRight.call(this, wrap) + } + } + + const cursorLeft = Window_Options.prototype.cursorLeft + Window_Options.prototype.cursorLeft = function (/** @type {boolean} */ wrap) { + const index = this.index(); + const symbol = this.commandSymbol(index); + if (symbol === font_symbol) { + // @ts-ignore changeValue should have `value: any` + this.changeValue(font_symbol, getNextFont(false)) + } else { + return cursorLeft.call(this, wrap) + } + } + + Object.defineProperty(ConfigManager, font_symbol, { + get: function () { + return font + }, + set: function (value) { + font = value + }, + configurable: true + }) + + const makeData = ConfigManager.makeData + ConfigManager.makeData = function () { + const config = makeData.call(this) + config[font_symbol] = font + return config + } + + const applyData = ConfigManager.applyData + ConfigManager.applyData = function (config) { + applyData.call(this, config) + if (font_symbol in config && typeof config[font_symbol] === 'string') { + font = config[font_symbol] + } + } + + const mainFontFace = Game_System.prototype.mainFontFace + Game_System.prototype.mainFontFace = function () { + if (font === disabled) { + return mainFontFace.call(this) + } else { + return font + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b34c376 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,61 @@ +{ + "name": "rmmz-sugoisubtitles", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rmmz-sugoisubtitles", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/node": "^24.10.1", + "@types/web": "^0.0.294", + "nwjs-types": "^1.0.0", + "rpgmaker-mz-types": "^1.0.0" + } + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/web": { + "version": "0.0.294", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.294.tgz", + "integrity": "sha512-prZi2M3jd/lGeOhW9P3txXfn6/nXIJRn+w/aFHz94/dl04riO5V99n+sKSeIciq7FM2XY6wPWoNhNbm6S/AdMQ==", + "license": "Apache-2.0" + }, + "node_modules/nwjs-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nwjs-types/-/nwjs-types-1.0.0.tgz", + "integrity": "sha512-lMOCPWuUIK5/g+3cPj/E1Z1dw+kjCpdT+7s9LqbY4AM9WMy76QOZ3Kk+c983GTKadkRrWazOKThhTUDgpl898A==", + "license": "MIT", + "dependencies": { + "@types/node": "^11.11.3" + } + }, + "node_modules/nwjs-types/node_modules/@types/node": { + "version": "11.15.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.15.54.tgz", + "integrity": "sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g==", + "license": "MIT" + }, + "node_modules/rpgmaker-mz-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rpgmaker-mz-types/-/rpgmaker-mz-types-1.0.0.tgz", + "integrity": "sha512-oaPUL8WvmN9WrvhWXtkpTJrXZJVw8pgCqXOylE7L+fpDI5A4udItx53hDTd5ApPmaHNeX1iewTI9i9mXDgeM3Q==", + "license": "ISC" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..09b5edd --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "rmmz-sugoisubtitles", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "dependencies": { + "@types/node": "^24.10.1", + "@types/web": "^0.0.294", + "nwjs-types": "^1.0.0", + "rpgmaker-mz-types": "^1.0.0" + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3c2fc00 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "checkJs": true, + "noEmit": true, + "target": "es2020", + "module": "es2020", + "types": [ + "@types/web", + "@types/node", + "nwjs-types", + "rpgmaker-mz-types" + ] + } +} \ No newline at end of file