Tool RPGM SLR - Offline JP to EN Translation for RPG Maker VX, VX Ace, MV, MZ, and Pictures

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
I've released v2.005.
Implemented the word wrap text command calculation change thing.
Revamped the drawing module of SEP.
It's now much faster. During tests it was exporting pictures in under 1 second.
It now supports angled/rotated text. (But still not vertical)
Blur can no longer affect new text, because all blur boxes are applied before any text is applied.
The blur masking can now be turned off completely in the options menu.
 

RTS23

Newbie
Apr 10, 2018
76
92
141
What are you talking about? You wrote that feature. :KEK:
It's replacing text commands in the text used to determine break points for word wrapping, is it not?
I have no clue how your code is actually handling that, but I would hope that it works without replacing anything in the actually wrapped text.
Yes, it only matches the command to skip it and add the replace length for wrapping without touching the actual wrapped text.

What I am talking about is that I did't understand what did you put Deepseek to do with what and for what. So first I guessed you were trying to add the feature to the LLM input when translating, which I discouraged. Then thought you were making the LLM to write a description of the feature, which now I've confirmed by looking at the new version (which is good).
 

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
I've released v2.007.
I didn't make a specific post for 2.006, since nobody really cares about SEP besides me.
But both combined I made error handling A LOT better for SEP and DSLR.
DSLR will now also log all requests and responses to the console even if it did not detect a problem.
That means whenever you see a terrible translation you will now be able to check what the actual request was, in case it wasn't actually the LLM screwing up, but DSLR making a bad request, that needs to be prevented.
(A lot happens to a cell before any of it is actually sent to the LLM to preserve scripts and stuff like that, it's very rare that the entire cell will actually be fed as is.)
 
  • Like
Reactions: RTS23 and Samjaza

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
Just some numbers to hopefully make certain questions stop.

Let's say we want to translate a game with 4 million characters of text that needs translation (Including duplicates, 16 SLR batches), which would be a small to medium sized game.
And we use deepseek-chat-v3-0324 with the second fastest provider on OpenRouter Baseten (The technically fastest SambaNova is basically a scam), because we want the translation to finish as fast as possible. (There are significantly cheaper options.)
That would be running costs of $0.77/mt input and $0.77/mt output, + 5.5% tax.
A token is on average 4 characters, and we will not be using cache because it makes AI translations worse.

That means the absolute minimum amount to spend on the translation would be $1,65, assuming an optimistic 110% input / 100% output ratio, and if you assume that you do not ever have to redo any part of it due to bugs, and not a single AI response ever needs correction.

If we would have used GPT4.1 instead ($2/mt input $8/mt output + 5.5% tax).
Then (everything else being the same) that would be an absolute minimum of $10,76.

Or differently put, using GPT would be a 552% cost increase compared to using the second fastest DeepSeek provider.

If you feel like the translation is also 552% better go for it, but please note that dazedanon's translations are not in any way representative of the normal quality of GPT4.1, his stuff is not raw GPT output by any means, people don't give him enough credit.
 
Last edited:

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
I've released v2.008 v2.009
Edit: Changed how the cache file names are generated in v2.009 so they aren't this stupid long and using something like ":free" no longer makes the cache unique. If you used any version before v2.009 to make persistent cache files you will have to rename them.
The translator cache is located at www>addons>SLRtrans.
Your project cache is at www>php>cache btw.

Revamped the DSLR Cache System, it's now actually usable.

It will now create individual cache files based on LLM model. Meaning it can no longer put qwen translations into a deepseek cache, etc.
Added new option "Clean Persistent Cache".
It makes it so translations will be cached to separate "Clean" files when no Context Prompt was given.
The Persistant Cache option disables Clean Persistent Cache and still always caches everything.
Added new option Batch Cache.
Batch Cache only uses cached translations if every line in the current batch was cached in the session or in active cache files. "Clean" cache files will only be used if no Context Prompt was given.
Renamed old Cache option to Line Cache. Line Cache overwrites Batch Cache.

The Batch Cache option now means that it is incredibly unlikely that the cache will make the translation worse, but you still do not have to pay double for long repeated sections. (Which are really common in VX and VX Ace games)
And there's also no real downside to using persistent clean cache because it would have given the same response anyway.

But if you are someone who actually changes the other prompts I recommend keeping all persistent cache off.
 
Last edited:
  • Like
Reactions: rzerces

Zoidbergio

New Member
Dec 31, 2024
6
0
69
I set it up last night with LM studio locally with reasoning enabled using qwen3-30b-a3b-abliterated-erotic-i1@q4_1 It is generally working but taking much longer than it seems it could. It repeatedly will error for significant amounts of Japanese causing it to eventually go individually and take a lot of time to seemingly arrive at the same answers.

[SLRBatchTranslator] Starting batch 2 of 1427
[SLRTranslator] Sending 26 lines (processed from 26 rows) to DSLR.
[DSLR] Translating texts: 26/26 (Accepted LLM translations: 26)
[SLRTranslatorEngine] Saving translation cache to Clean Cache file.
[DSLR] (1/2) Retrying Full Batch with new prompt due to significant amounts of Japanese in the response.
[DSLR] (2/2) Retrying Full Batch with context assistant prompt and the agressive prompt due to significant amounts of Japanese in the response.
[DSLR] (1/3) Trying only the first half of the batch due to significant amounts of Japanese in the response.
[DSLR] (2/3) Retrying first half of the batch with new prompt due to significant amounts of Japanese in the response.
[DSLR] (3/3) Retrying first half of the batch with context assistant prompt and the agressive prompt due to significant amounts of Japanese in the response.
[DSLR] Did not receive usable batch response. Now trying each individual requests instead.
[DSLR] Individual translation checking completed.
[DSLR] Final token summary:
- Prompt tokens: 22325
- Completion tokens: 25116
- Total tokens: 47441
[SLRTranslator] The 26 lines batch took: 767.5 seconds.
Performance: 3.1 characters per second. 0 rows per second.
[SLRBatchTranslator] Inserting into tables...
Processed 2 of 1427 batches

When I check the LM studio output, occasionally I will see Japanese or romanji after the end of the think section but 95%+ of the time it is all in English when SLR rejects it. So not sure why it is being rejected or if I am missing some setting...

An example rejection starting from the 2nd think tag

\n</think>\n\nQueen who rules the Sultry Beach. Possesses mysterious martial arts skills.\n\\C[29]Ex Form\\C[0]:\\C[30]『Slick Milk』\"Skill Boost\"\n\nShisдye\n\nSonia\n\nShisдye\n\nA nun working at the headquarters of the World Church. Skilled in making holy water.\n\\C[29]Ex Form\\C[0]:\\C[23]『Demonophobia』\"Style Change\"\n\nShisдye\n\nSilvi\n\nShisдye\n\nA warlord who uses cursed seals bearing the name of a wind bird, sent from the Empire.\n\\C[29]Ex Form\\C[0]:\\C[23]『Divine Artifact Activation』\"Style Change\"\n\nShisдye\n\nViner\n\nShisдye\n\nA mysterious monster that claims to be a tree spirit but doesn't look it.\n\\C[29]Ex Form\\C[0]:\\C[30]『Blossom』\"Skill Boost\"\n\nShisдye\n\nMary\n\nShisдye\n\nThe second princess of the Drakina Kingdom guarding a fortress located in the southeast of the kingdom.\n\\C[29]Ex Form\\C[0]:???\n\nShisдye\n\nThe second princess of the Drakina Kingdom captured at Mioria's fortress.\n\\C[29]Ex Form\\C[0]:???\n\nShisдye\n\nMobha\n\nShisдye\n\nCommander of the royal guard who protects the kingdom's fortress alongside Mary.\n\\C[29]Ex Form\\C[0]: - None\n\nShisдye\n\nFay\n\nShisдye\n\nMaggie-chan",
 

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
I set it up last night with LM studio locally with reasoning enabled using qwen3-30b-a3b-abliterated-erotic-i1@q4_1 It is generally working but taking much longer than it seems it could. It repeatedly will error for significant amounts of Japanese causing it to eventually go individually and take a lot of time to seemingly arrive at the same answers.

[SLRBatchTranslator] Starting batch 2 of 1427
[SLRTranslator] Sending 26 lines (processed from 26 rows) to DSLR.
[DSLR] Translating texts: 26/26 (Accepted LLM translations: 26)
[SLRTranslatorEngine] Saving translation cache to Clean Cache file.
[DSLR] (1/2) Retrying Full Batch with new prompt due to significant amounts of Japanese in the response.
[DSLR] (2/2) Retrying Full Batch with context assistant prompt and the agressive prompt due to significant amounts of Japanese in the response.
[DSLR] (1/3) Trying only the first half of the batch due to significant amounts of Japanese in the response.
[DSLR] (2/3) Retrying first half of the batch with new prompt due to significant amounts of Japanese in the response.
[DSLR] (3/3) Retrying first half of the batch with context assistant prompt and the agressive prompt due to significant amounts of Japanese in the response.
[DSLR] Did not receive usable batch response. Now trying each individual requests instead.
[DSLR] Individual translation checking completed.
[DSLR] Final token summary:
- Prompt tokens: 22325
- Completion tokens: 25116
- Total tokens: 47441
[SLRTranslator] The 26 lines batch took: 767.5 seconds.
Performance: 3.1 characters per second. 0 rows per second.
[SLRBatchTranslator] Inserting into tables...
Processed 2 of 1427 batches

When I check the LM studio output, occasionally I will see Japanese or romanji after the end of the think section but 95%+ of the time it is all in English when SLR rejects it. So not sure why it is being rejected or if I am missing some setting...

An example rejection starting from the 2nd think tag

\n</think>\n\nQueen who rules the Sultry Beach. Possesses mysterious martial arts skills.\n\\C[29]Ex Form\\C[0]:\\C[30]『Slick Milk』\"Skill Boost\"\n\nShisдye\n\nSonia\n\nShisдye\n\nA nun working at the headquarters of the World Church. Skilled in making holy water.\n\\C[29]Ex Form\\C[0]:\\C[23]『Demonophobia』\"Style Change\"\n\nShisдye\n\nSilvi\n\nShisдye\n\nA warlord who uses cursed seals bearing the name of a wind bird, sent from the Empire.\n\\C[29]Ex Form\\C[0]:\\C[23]『Divine Artifact Activation』\"Style Change\"\n\nShisдye\n\nViner\n\nShisдye\n\nA mysterious monster that claims to be a tree spirit but doesn't look it.\n\\C[29]Ex Form\\C[0]:\\C[30]『Blossom』\"Skill Boost\"\n\nShisдye\n\nMary\n\nShisдye\n\nThe second princess of the Drakina Kingdom guarding a fortress located in the southeast of the kingdom.\n\\C[29]Ex Form\\C[0]:???\n\nShisдye\n\nThe second princess of the Drakina Kingdom captured at Mioria's fortress.\n\\C[29]Ex Form\\C[0]:???\n\nShisдye\n\nMobha\n\nShisдye\n\nCommander of the royal guard who protects the kingdom's fortress alongside Mary.\n\\C[29]Ex Form\\C[0]: - None\n\nShisдye\n\nFay\n\nShisдye\n\nMaggie-chan",
The way the Japanese rejection works is that, it creates a numeric value by removing all whitespace from the response and counting the characters. It then creates a second numeric value from the response after removing all characters that fit this pattern
Code:
/[^一-龠ぁ-ゔァ-ヴ々〆〤ヶレディファイッ]/g
and counting the remains.
It only rejects a batch if the second value is higher than the first value divided by 8.

So basically, if the batch has 500 characters, the response is allowed to have 62 Japanese characters.
If that does not seem to be the case, then either the batch logging doesn't work, or something is seriously wrong.

Using the pattern on your example batch would be a value of 0, so if you can confirm that this specific one was rejected with a message claiming it was for significant amounts of Japanese then that is definitely not working as intended.
Which game are you trying to translate? I need to replicate that on my end.

One definite crime is that I had a typo in "aggressive". :HideThePain:

Edit: I just realized that your example has a think block. Do you have reasoning enabled in the options menu?
If yes, where did you get that example? Was that in the log messages of the SLR Translator console?
 
Last edited:

Zoidbergio

New Member
Dec 31, 2024
6
0
69
The way the Japanese rejection works is that, it creates a numeric value by removing all whitespace from the response and counting the characters. It then creates a second numeric value from the response after removing all characters that fit this pattern
Code:
/[^一-龠ぁ-ゔァ-ヴ々〆〤ヶレディファイッ]/g
and counting the remains.
It only rejects a batch if the second value is higher than the first value divided by 8.

So basically, if the batch has 500 characters, the response is allowed to have 62 Japanese characters.
If that does not seem to be the case, then either the batch logging doesn't work, or something is seriously wrong.

Using the pattern on your example batch would be a value of 0, so if you can confirm that this specific one was rejected with a message claiming it was for significant amounts of Japanese then that is definitely not working as intended.
Which game are you trying to translate? I need to replicate that on my end.

One definite crime is that I had a typo in "aggressive". :HideThePain:

Edit: I just realized that your example has a think block. Do you have reasoning enabled in the options menu?
If yes, where did you get that example? Was that in the log messages of the SLR Translator console?
I had just grabbed the first game I found on my PC that was untranslated to test it out. Looks like it is the v1.14 here:
https://f95zone.to/threads/eclipse-...t-mary-rj01130999-tsukinomizu-project.185896/

Quick note I am using the v2.009. I am going to do a redownload and setup of settings to see if I messed up something and will share if anything changes.
I do have reasoning enabled. The think block example came from the log on LM studio and was from Actors section of the game files.

I have also had an issue pop up on a few commands like the below SLR log where it seems to be prompting LM studio with \V"126" but expecting it to reply with \V[126] and rejecting. This example was from the Map001 section.

[DSLR] (12/12) Retrying single translation with full context of previous attempts. Reason: LLM response screwed up this command: \V[126]
[DSLR] Failed to get a usable translation.
Last reason:
LLM response screwed up this command: \V[126]
Request:
メアリ変数チェック \V"126"
Last response:
Mary Variable Check \V"126"
[DSLR] Batch failed.
[DSLR] Final token summary:
- Prompt tokens: 32731
- Completion tokens: 38574
- Total tokens: 71305
Error: Error: Received too few translations.
 

Zoidbergio

New Member
Dec 31, 2024
6
0
69
The way the Japanese rejection works is that, it creates a numeric value by removing all whitespace from the response and counting the characters. It then creates a second numeric value from the response after removing all characters that fit this pattern
Code:
/[^一-龠ぁ-ゔァ-ヴ々〆〤ヶレディファイッ]/g
and counting the remains.
It only rejects a batch if the second value is higher than the first value divided by 8.

So basically, if the batch has 500 characters, the response is allowed to have 62 Japanese characters.
If that does not seem to be the case, then either the batch logging doesn't work, or something is seriously wrong.

Using the pattern on your example batch would be a value of 0, so if you can confirm that this specific one was rejected with a message claiming it was for significant amounts of Japanese then that is definitely not working as intended.
Which game are you trying to translate? I need to replicate that on my end.

One definite crime is that I had a typo in "aggressive". :HideThePain:

Edit: I just realized that your example has a think block. Do you have reasoning enabled in the options menu?
If yes, where did you get that example? Was that in the log messages of the SLR Translator console?
So, a clean download did resolve the Japanese rejection, but the \V[126] issue I had show up on Map001 still occurs.

[DSLR] Failed to get a usable translation.
Last reason:
LLM response screwed up this command: \V[126]
Request:
メアリ変数チェック \V"126"
Last response:
Mary Variable Check \V"126"
[DSLR] Batch failed.
[DSLR] Final token summary:
- Prompt tokens: 9832
- Completion tokens: 12177
- Total tokens: 22009
Error: Error: Received too few translations.

I must have accidentally toggled something I shouldn't have setting it up the first time around. Big drop in token count. :)
 

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
So, a clean download did resolve the Japanese rejection, but the \V[126] issue I had show up on Map001 still occurs.

[DSLR] Failed to get a usable translation.
Last reason:
LLM response screwed up this command: \V[126]
Request:
メアリ変数チェック \V"126"
Last response:
Mary Variable Check \V"126"
[DSLR] Batch failed.
[DSLR] Final token summary:
- Prompt tokens: 9832
- Completion tokens: 12177
- Total tokens: 22009
Error: Error: Received too few translations.

I must have accidentally toggled something I shouldn't have setting it up the first time around. Big drop in token count. :)
It's an issue with the system meant to protect cornerbrackets. I probably screwed up one of the regex patterns of the single request block. It works properly for \N[] stuff, but I forgot to properly consider \V[] at the end of lines it seems. Also probably means the same issue exists for \C[] as well
I can't really fix it right now because construction nearby fucked up the old phone cable that was providing internet to my house. I'm currently using the wifi of some bakery and I definitely cannot upload large files... :HideThePain:
I still have no idea how long until I have internet again, because "obviously" my provider is still in the phase of pretending I'm just too stupid to plugin the cable and they want to send a tech guy "at some point" to check on it.
 

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
So, a clean download did resolve the Japanese rejection, but the \V[126] issue I had show up on Map001 still occurs.

[DSLR] Failed to get a usable translation.
Last reason:
LLM response screwed up this command: \V[126]
Request:
メアリ変数チェック \V"126"
Last response:
Mary Variable Check \V"126"
[DSLR] Batch failed.
[DSLR] Final token summary:
- Prompt tokens: 9832
- Completion tokens: 12177
- Total tokens: 22009
Error: Error: Received too few translations.

I must have accidentally toggled something I shouldn't have setting it up the first time around. Big drop in token count. :)
Put the DSLREngine.js into the www>addons>SLRtrans>lib>TranslationEngine folder and overwrite.
This should fix it. I'll make a proper update once I have internet again.

The issue was this pattern that shows up 3 times throughout the code:
JavaScript:
.replaceAll(/(\\[cdinvw])\[(\d+)\](\s*[\]\)}〕〗〙〛〝〞”」〉》」』】)]>>}⦆〟⟩"'`´]+\s*;?$)/gi, "$1SHIBRACK$2SHIBRACK$3");
It needed to be
JavaScript:
.replaceAll(/(\\[cdinvw])\[(\d+)\](\s*[\]\)}〕〗〙〛〝〞”」〉》」』】)]>>}⦆〟⟩"'`´]*\s*;?$)/gi, "$1SHIBRACK$2SHIBRACK$3");
instead.

Just a "+" needing to be a "*" instead so it also accepts null.
:FacePalm:
 

Zoidbergio

New Member
Dec 31, 2024
6
0
69
Put the DSLREngine.js into the www>addons>SLRtrans>lib>TranslationEngine folder and overwrite.
This should fix it. I'll make a proper update once I have internet again.

The issue was this pattern that shows up 3 times throughout the code:
JavaScript:
.replaceAll(/(\\[cdinvw])\[(\d+)\](\s*[\]\)}〕〗〙〛〝〞”」〉》」』】)]>>}⦆〟⟩"'`´]+\s*;?$)/gi, "$1SHIBRACK$2SHIBRACK$3");
It needed to be
JavaScript:
.replaceAll(/(\\[cdinvw])\[(\d+)\](\s*[\]\)}〕〗〙〛〝〞”」〉》」』】)]>>}⦆〟⟩"'`´]*\s*;?$)/gi, "$1SHIBRACK$2SHIBRACK$3");
instead.

Just a "+" needing to be a "*" instead so it also accepts null.
:FacePalm:
Thanks a bunch for the fix. I will try it out.
And thanks for all the time you seem to put into the tool.
Good luck with the internet getting fixed.
 

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
Partially fixed my internet problems. At least enough to upload stuff.

I've released v2.010
Fixed DSLR breaking commands at the end of cells.
Changed some post processing for Skills, States and plugins.
Main change is that it will now always put spaces at the start of combat skill snippets, so they are actually readable even if the LLM screws up.
 

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
I found a really weird bug that doesn't make sense to me, yet.

If a grabbed entry looks like this in the code:
Code:
"\"TEXT\""
and it is changed, it sometimes ends up as:
Code:
"\"\\\"TEXT\\\"\""
when exporting.

So far I have no idea why.
My first thought was that it just doesn't get that it's escaped and uses the inner "" to place the text, but the really weird bit is that it doesn't do it consistently. I would expect it to then always do that.

Edit: It seems to only affect StringLiteral stuff from MZ.

Edit2: I think I get it. It's hard to explain, but basically nodejs is a bit stupid when it comes to determining what a string is and what a json string is. I'll fix it next update.
 
Last edited:

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
I'm trying to translate a fairly long complicated game right now and DeepSeek is seriously shitting the bed, I had to reduce batches to 1500c and even now it constantly gets to the point of having to half it to 750c until it gives a response that actually includes the same entry count as the request. I have no clue what is causing it, yet.
Normally it has no issue with 3000c batches...

Edit: In case it's not obvious why that is a problem. Smaller batches cost a lot more money because it keeps having to re-send all the different instruction prompts. It also misses out on context, potentially making the translation worse.
 
Last edited:

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
I've released v2.012.
Most notable change:
Added 4 more DSLR options.
Minimum Sent Cells, Maximum Sent Cells, Minimum Sent Lines, Maximum Sent Lines.
They allow you to limit/require a set amount in a batch regardless of the set character limit.

The idea is that if you know that your LLM struggles to preserve all dividers after a certain amount of lines you can prevent DSLR from sending that much, even if the individual character count is super low.
Or that you can set a minimum amount of cells to be sent so that the LLM will always have enough context even if the individual cells have a lot of characters and you would run out.

It's still a pretty wonky, the Line ones basically don't do anything, since the limiting factor should be the batch size not the request size. But it's certainly better than just having that character count setting.

Edit: I had a brainfart. While it is enforcing a minimum amount of cells sent to DSLR, they get filtered by the wrapper afterwards. Which means a minimum amount of 40 cells can still result in a batch with only 23 lines. So it's kinda useless right now.

Edit2:
v2.013 is going to be a huge improvement. I just had one of those "I should have done that ages ago" moments when it comes to my batch translation system in general. Please wait a bit if you are planning a project using DSLR.
 
Last edited:
  • Like
Reactions: rzerces

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
I've released v2.013, fixing the mess that was v2.012.
If you are using DSLR please update, it's now better in general.
Faster, less token usage, more accurate cache, same translation quality.

On default the SLR Batchtranslator now sends a batch with a maximum of 10000 characters to the DSLR engine.
The DSLR engine then divides that batch into requests based on the Request Character Limit (default 1200 characters), but always at least whatever is set as Minimum Sent Lines (default 40 lines) and never more than what is set as the Maximum Sent Lines (default 200 lines).
Should a batch cause the next batch to have less than the Minimum Sent Lines, then it will merge with that batch to rather create a slightly larger batch than allow one without sufficient context. (They can still be split once if the LLM fails 3 attempts.)
Because the batches handled by the Batchtranslator are so large now and only exact matches use the cache, it's now almost impossible to have a cache hit unless it is exactly something you've translated before, ensuring it will not decrease translation quality.
It also means that the token summary of a batch is a lot more useful.
Loosing a large batch because of a single error is frustrating, but for the sake of translation quality Line Cache shouldn't really be used anyway.

All of this stuff can be customized in the options menu.

If you are using an endpoint that allows you concurrent requests, The UI might get pretty messy now. It "should" still work if you enable it in the options, but you might want to decrease batch size to less than 10k though.
 
  • Like
Reactions: Samjaza

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
Btw, I'm open to suggestions when it comes to further development of SLR Translator.

But suggestions that require funds are out of the question because this project has absolutely no funding, and while I'm fairly confident in my development skills now, if you suggest a change or addition, please describe how you would actually try to implement it.

For example "Add support for 'Game Engine'." is always going to be a "No." unless you can actually tell me how to get to the text of that specific engine, and the truth is that RPG Maker is actually pretty special in that it allows you to get to the plain text, most game engines do not do that. I need to be able to read and change the game files directly, no workarounds like real time extraction/injection.
 

Shisaye

Engaged Member
Modder
Dec 29, 2017
3,463
6,148
676
Bro, can you teach me to edit font size?
For what engine?
For MV it's usually in the plugins.json, for MZ it's usually in the system.json.
For VX, VX Ace it's not standardized in any way, but you can try adding a catchall command to Main of Scripts.