Cheat Mod Ren'Py Doll City - MultiMod [1.5.2.1.1][Mattock]

Mattock

Member
May 27, 2018
104
81

Overview:
-error-corrections
-optical changes(improvements)
-tips on choices (selectable)
-scene replay gallery​

Updated: 2025-3-3
Game/Creator: Doll City /
Mod Version: 1.5.2 _ 2
Game Version: 1.1

General note on any mods!
MAKE A BACKUP! BEFORE! installing any mods!

Download in a spoiler-tag(for registered users only):
You don't have permission to view the spoiler content. Log in or register now.
If your italian is better than your english you will want to look at the: translation from GioBol - The Librarian


Installation:
depack the archive(MttkMod1_5_2_2DC11.7z) into your DollCity-1.1-pc\game\ -folder

How to use:
click "MttkMod" in navigation-screen;
browse through mod-options;
if some option is not self-explanatory enough, refer to MttkModMenuReadMe.txt
(if in main-menu-context can select e.g. "modders' default" to set many options at once)



You don't have permission to view the spoiler content. Log in or register now.
You don't have permission to view the spoiler content. Log in or register now.
 
Last edited:

Mattock

Member
May 27, 2018
104
81
changelog (in spoiler):
You don't have permission to view the spoiler content. Log in or register now.
more about translations and my MOD:
I reworked my MOD-frame to be more translation-ready.
GioBol - The Librarian did a translation to italian for the game (which I did not see in the 1st place!)
(as an extended remark, I can't (really) speak italian!)
GioBol, by default, has a "zzzStartGB.rpy/c" accompanying his translations.
Especially about RollBack GioBol and me do play differntly...
Now GioBol even gone out of his way and tranlated my MOD too(see link in 1st post!)
and there even left out this "somewhat conflicting" StartGB. thanks!
->Meaning to change into italian, in main_menu you need to go my MOD "General Modding" and change language to "GBItalian"
(also described in italian in his download in "LEGGIMI.txt")
 
Last edited:

GioBol - The Librarian

Forum Fanatic
Modder
May 19, 2021
4,788
25,212
Hi. Unfortunately my English is little more than what I studied in school in the 70s, so I use Google Translate which I find very good (unlike the APIs of both DeepL and Google itself).
I'll answer you about the "config.replace_text".

I'll start by saying that I don't know and don't develop in Python, but I've been doing translations for almost three years and over time I've understood some of Ren'Py's behaviors.

Nowadays all Italian translators use t.replace() and re.sub(r"\bWord\b" , "Parola",t), when needed (not always), because old/new does not work with all strings and you risk having only the dialogues translated and not various other strings that appear on the screens, such as phone messages, statistics, people's profiles, etc. etc.
To make a good translation, t.replace() is now much more effective than old/new or linechange.

Obviously not all games need t.replace(), let's say that VNs rarely require it, but sandbox games require it in 95% of cases, unless you are happy with having the various screens with texts in English, with the risk, in most sandbox games, of playing half in Italian and half in English. It is not acceptable for Italian players.
This is because old/new do not work for most strings other than simple dialogues.
Also old/new does not work with concatenated strings (eg. "string1" + value + "string2), so in this case to translate the strings you necessarily need to use t.replace()

You should try to do some translation to understand, because I noticed that Ren'Py treats some instructions differently if they are used in the scripts present in the game folder or if they are used in the scripts present in the game/tl, such as t.replace(), which have very different behaviors.

I noticed that Russian developers do not use t.replace() in game/tl/english, but the strings that are not translated are inserted in English directly into the original scripts along with the Russian strings, as well as translating the texts in the images into English.
Otherwise who would buy their game? :D

Before 03/01/2024 I translated with other tools and I used t.replace() only and exclusively if I couldn't do without it.
Since that date I use Zenpy Pro which creates four files:
- dialogue.rpy: contains only the dialogues;
- strings.json: contains all the strings that are not dialogues;
- replaceText.rpy: is the t.replace() manager with the strings.json file;
- strings.rpy: contains only the old/new

In most sandbox type games if you delete the strings.json and replaceText.rpy files the game remains in Italian with only the dialogues and little else. Not everyone accepts it.

Regarding the StartGB.rpy file, it is a legacy from my early days translating (2022) and has always remained that way.

However, I recently modified it and now I put it in the game and no longer in game/tl/GBItalian, precisely because in some games it only works if it is in the game and not in game/tl. I attach it to you.
Regarding how to start it, a simple script in the game with only the instructions is enough:
Python:
init python:
   config.language = "GBItalian"
   config.default_language = "GBItalian"
 

GioBol - The Librarian

Forum Fanatic
Modder
May 19, 2021
4,788
25,212
But either way, my tips on choices (also in screens) do work(if enabled) and choices are shown in italian;
only content of my MOD is still in english(e.g. "continue"...)
mebbe with further MODs I start making my "tips" translatable...i.e. _( "continue" ) ... (even more todo@me;)
(but not with this game)
Menu items that are modified by adding colors and a sentence in brackets work because new old/new are created with the modified choice.
There are modders who not only add colors and a suggestion, but also add the number like:
1. choice1
2. choice2
These menus will appear in English because any old/new will stop working.
There are only two ways: put the menu choices in the t.replace(), or modify screen choice()
In the past I modified screen choice() because I didn't want to do dozens and dozens of t.replace() by hand, but since I use Zenpy Pro this problem is overcome, because thanks to those two files replaceText.rpy and strings.json the translated strings are almost 100%, only the texts in the images remain in English.

Using _() is not a solution, because unfortunately it does not work with all instructions.
I have seen developers insert _() with concatenated strings (+), unfortunately the old/new are not created correctly and do not work, so t.replace()

But honestly, I can't figure out where my translation inspired you.
Tomorrow I'll update the Doll City translation and add your Mod. ;)
 
Last edited:

GioBol - The Librarian

Forum Fanatic
Modder
May 19, 2021
4,788
25,212
Here are some examples of how the translation looks without t.replace().
WITHOUT t.replace()
1740741235054.png
1740741310991.png In this screen only those strings that work with old/new are translated.

WITH t.replace()
1740741553233.png
1740741595054.png

Nobody likes half translations. :)
Imagine playing a Russian game with English dialogues and boxes here and there with Russian texts because old/new did not translate. I don't think that's acceptable for an English player.
That's why Russian developers insert English texts directly into the original code.
 

GioBol - The Librarian

Forum Fanatic
Modder
May 19, 2021
4,788
25,212
Well, I redid the translation.
There are two translation packages, one is the normal one without your Mod, the other contains your Mod.
In the one that contains your Mod I removed my "zzzStartGB.rpy", so as not to interfere, so the game starts in English and you need to call your Mod again to select the Italian language.
I wrote the instructions in the "LEGGIMI.TXT" file.
https://f95zone.to/threads/italian-library-of-complete-games-by-giobol.166501/post-13273167

(Are you there? :oops:)
 

Mattock

Member
May 27, 2018
104
81
oh my god...you are lightyears too FAST for me!
(i.e. you're ~normal~ and I'm slower than a turtle!)

I know I did "at" you, but see down, I meerly wanted you to know about it,
and yes, this was not ~OK~ by me...

I only can apologize to you again! I NEVER meant you to change your MOD that massive,
because of my MOD that virtually NOBODY will be using...ahh..I'm SO MUCH SORRY!!!



following what I had started writing yesterday and finializing now:..
hmmm...I see, I see...

1st! thank you for your detailed explanation !

well "inspired" was not correct...I had meant my mini-update concerning translation.
Which was my fault from the start, because I failed to notice your translation-MOD before I published my MOD.
I DO (now) apologize!

Even though I'm not a native english too, I only roughly engaged in translation.

Yes:
"someSayText" + str(someVarThatMayBeA-NumberOrNot) + "someOtherSayText"
will be a pain in the a?? if you want to translate!..

and I use that ~"somewhat"~ massively!..
(never thought about it...)


"solution" is to "tokenize" EVERY ~"string"~ and I now do admit,
I don't see much other way than "config.replace_text".

I DID have ~bad feelings~ about that, because it is one of the most
"TOP-LEVEL-CallBacks" of RenPy...many years ago, I did start using exactly that
to add "tips" to "choices"...
NOW I ~"override"~ the screen choice...
and thus I am very happy you found a way to translate
without replacing screen choice.


I'm not exactly sure what you mean with ´t.replace()´, I suppuse its something you commented out in your replaceText.rpy/c /// i.e. the simple python-string-method: replace.
but it doesn't matter!

I met text-tokenization when modding a game, that deactivated History, because it caused an exception, because dev used "[" in say!
I'm somewhat sure you know about it, but following (renpy-history)function does tokenize and can remove ~"text-tags"~:
renpy.filter_text_tags(h.what, allow=gui.history_allow_tags)
->while ´gui.history_allow_tags´ can be "allow" OR "deny"!
EDIT: (strikes) you can give (kw)Arg ´allow´ OR ´deny´ !)


I then fumbled with "strings.json" (I'm still looking for the dict in renpy.store, only found "zenpy_strings", but that seems to be a dict from translation to translation...)
I am using "continue"(WITH enclosing text-tag AND as an addition to "choice"(with leading line-break) aswell as in my "ChoiceScreens" especially in this game ALOT!
-> adding (e.g.) "continue" : "ITAcontinue" to the "strings.json" worked (nearly) perfect, all occurances of "continue" were replaced by "itacontinue", when "GBItalian" was selected!


I know it looks like...but I never meant by "tipping you" to:
quote: Tomorrow I'll update the Doll City translation and add your Mod.
I'm rightfully looking like a ... bad man ...



finally...
(you seemingly did one hell of a job (in NO time)! (though for now I haven't had a look at your MOD! MY FAULT!!!))
Python:
init python:
   config.language = "GBItalian"
   config.default_language = "GBItalian"
yes this works, I would think setting config.default_language to "is not None" may result in loading a game, always using the default language; at least that was happening to me when I tried...
Not sure if this is (still) relevant, but I would want to be able to "switch" languages...
(you said you did that, and I'm sure it works like a charm!..)
(Are you there? :oops:)
hah...yeah, kinda;)
you shamed me, and I'm in your debt!
you should not have translated all my lousy screen-blah-blah!!!
"continue" "enable" "enabled" ... and so on and so forth should have been flagged BY ME _("translatable")


...


happy to have got more insight to translations!
unhappy someone else had to bug out MY failures...

will have a look to your update! (though I fear there will be no wish left for me to utter)
 
Last edited:

GioBol - The Librarian

Forum Fanatic
Modder
May 19, 2021
4,788
25,212
I'll explain what t.replace() is, but it seems strange to me, since you know Ren'Py and Python well, unlike me.

Before I bought Zenpy Pro with its translation system with the four files, I used Renpy SDK for dialog extractions and menu choices, but a lot of text had to be extracted by hand and put in old/new like menu choices.
The problem is that old/new supports the text present only in some Ren'Py/Python instructions, while the rest is not translated.

The t.replace() is "the last anchor" to have these texts translated too, but it has a bad defect, that is, it replaces the text even if only a part of the word, so you have to pay a lot of attention to how they are compiled. At that point I started to combine the more performing re.sub() with t.replace, especially for single words.
I'll give you a script that I used as a basis to compile my t.replace() list before I started using Zenpty Pro.

The replaceText.rpy + strings.json pair do not implement a real t.replace(), but is more similar to:
t = re.sub(r"\bOriginal word\b" , "Translated word",t)
so it avoids the problem of text overlapping in the middle of a word ruining the translation.

The thing is that Zenpy Pro extracts all the texts, extra dialogues, and puts them in the strings.json file and duplicates many strings in the strings.rpy file with the old/new (old/new always takes precedence over "t.replace()" or whatever they are), but when an old/new does not translate, strings.json comes to the rescue.

Nonostante tutte queste precauzioni, né noi italiani, né gli spagnoli, i francesi, i tedeschi, i brasiliani, i coreani, ecc. riusciremo mai ad avere un gioco completamente tradotto con tutte le scritte in lingua, soprattutto se gli sviluppatori riempiranno i loro schermi con le scritte nelle immagini.

As for my translation with your Mod, I can reassure you, Mods are very popular with Italian players, especially if they integrate a walkthrough like your Mod, in fact for every download of the Clean translation, there are 2 or 3 with the Mod. :)
 

Mattock

Member
May 27, 2018
104
81
I was always sure you meant the default string(python module string) method...i.e.: string.replace() or by type str.replace()
like you referenced the re(python module re(i.e. Regular Expressions)) method sub: re.sub()
What brought me offtrack was the ´t´ in t.replace(), I now seen it's the name of your variable.
I was always looking for a python- or renpy-module or class named ´t´ with having a method: def replace(self, *args, **kwargs):
...
And even after I said, it doesn't matter, your unwavering patience only proved I should have accepted earlier the obvious meaning.


I found a (minor) glitch in my MOD and first thought it may be due to the translation; but luckily it is NOT.
(entirely my failure)
So I will do a (minor) update to my MOD the next days...


OMG, you really translated everything!, I'm SO SORRY!
Most of the error-messages will never be seen by anybody...
quite a few have the comment:#senseless safety

Damn, you even translated the ("triple-quotation"-)comments to the functions and classes, nobody will see those.
But how would your program know...It's a string and get's offered for translation...
Again I'm sorry to have caused so much work!


From what I understand of zenpy(the ~"strings.json"~-part) only(?) translates "Displayables",
(btw. I'm massive impressed, it managed to translate "Lo desideri!" which is an image defined in an init python hide:-block !!! yes, it's a Composite() with a Text()-Displayable...but WOW!)
but as much I can understand you want to give a "full" translation, most basic "strings" should be left untouched:
min. "True", "False", "None"; admittably those could be used to be shown to the user too, but...


Also as said you had done much too much too much work on things no player will ever see...
(additionally I seen one thing not translated, that should be translated...)
With the update I will give you a "strings.json" which should cover all needed strings from my MOD, but left out the totally unnecessary strings.

Plus, I would like to find a way for future MODs of me, to provide you(or other translaters) with a
~"positive-list of strings that may want to be translated"~
in a form you have the least work with.(e.g. a .json-"dict")


But as there is no problem with your translation, that is not in the english MOD, I want to take some days...
I hope you can forgive me ;)

greets Mattock

EDIT: re=RegEX
 
Last edited:

GioBol - The Librarian

Forum Fanatic
Modder
May 19, 2021
4,788
25,212
Don't worry, there's no need to forgive anyone, you do your job and you know Python, while I don't know Python and I just do the translations.
The work is all done by Zenpy Pro, which extracts practically everything that is enclosed in double quotes (""), even those that are not needed.
However, in the sea of translated lines there are also valid and active ones.
Zenpy Pro is an All-In-One tool for doing translations.

I don't know if you're interested, but before this tool I used Renpy SDK, but that only extracts the dialogues and menu choices, the rest has to be extracted by hand.
1740846518210.png
1740846576126.png
When I was using the Renpy SDK then there was a lot of work to do to figure out which strings to extract and translate them.
 

Mattock

Member
May 27, 2018
104
81
oh...sorry, this is going to be a long post! somewhat fitting for my 100th post! TOO LONG TO READ *rofl

I will divide it in sections and put those in spoilers.

thanks for the link to ~"zenpy"~
You don't have permission to view the spoiler content. Log in or register now.

LLM/AI
You don't have permission to view the spoiler content. Log in or register now.


(pot. minor adjustments to) strings.json:
You don't have permission to view the spoiler content. Log in or register now.

sorry for the inconvenience, greets Mattock
 

GioBol - The Librarian

Forum Fanatic
Modder
May 19, 2021
4,788
25,212
Honestly, I can't follow you anymore, so I give up.
You speak with developer language and I'm not a developer
The only thing I understood is that you think that with my translation I violated the license of your code, if that's the case I apologize and I remove the translation that includes the Mod, but those who have already downloaded it can keep it.
In reality, I limited myself to automatically translating (DeepL) your code, not manipulating it.
You English people often use numbers instead of words (e.g. 2 instead of "to"), but online translators can't know this.

Regarding ZLZK, you should know that when I do a translation I use two files strings.rpy and strings.json with a few hundred lines already preset to avoid having to fix them every time, so the strings.json file already contains the block of translated lines for when I use this universal WT-MOD.
 
Last edited:

Mattock

Member
May 27, 2018
104
81
EDIT: thank you for the information about "ZLZK"!

aye, we pir8s are one of a kind.
(I knew, I better had not told "tech blah"...)

Well, I said you can leave the current translation; but that's up to you (up2u;).
(because only of you, I became aware of that problem)

In the future I want to provide a "MttkModStrings.json" and you can send that to any LLM/AI all you want.

But I don't want my code(i.e. rpy/c) to be exposed to LLM/AI.
Because while translating for you, they learn from my code.
But I don't want them to learn!
(Because, I believe, sometime in the future they will try to kill all humans.)

No offense meant, none taken.
 
Last edited:

Mattock

Member
May 27, 2018
104
81
I'll admit, when I read Deep, I thought about deepseek...now I learned DeepL is a german company. But of course they use LLM; as ANY OTHER translater!
Not that, this is a problem between us. I may don't like it, but it is totally OK, if you send strings(e.g. via a .json) to LLM/AI. That is ENTIRELY UP TO YOU.

As said, I have a problem if my .rpy/c-code is being shared with LLM/AI (not that I will ever be able to tell if someone did that, save s/he tells me).
It's just, you get the code for free, with no hooks attached, why not respect the coders' wishes, as weird as they may.

I'm done doing the "replace_text", now I do the HARD part: collecting the strings...and yes I DO envy you! because from what I seen; zenpy does a very good job, getting strings...
but exactly THERE is my problem: (I don't know if!, but) most likely the identification of strings want to be translated, is being done by LLM/AI and by compromising MY code to LLM/AI...
 

GioBol - The Librarian

Forum Fanatic
Modder
May 19, 2021
4,788
25,212
If you impose these constraints, it means that your Mods are a privilege only for those who play in English, excluding any translation, so no Italian, no Spanish, no French, no German, no Korean, no Chinese, etc. etc.
When some Italian player asks me to insert one of your written Mods for a game I will be forced to refuse to respect your will.
You are the only modder that imposes these limitations, not even Sancho1969 complained that I betrayed the games with his Mod. Instead other Modders don't have any objections to me translating games with their Mods, in fact, they give me support if I need it.
You could protect your Mods like Sancho1969 did.
 

Mattock

Member
May 27, 2018
104
81
Sancho1969
You don't have permission to view the spoiler content. Log in or register now.
The obfuscation of his, is meant against humans, machines will have ZERO problems reading his code.
i.e. obfuscation will not protect code from LLM/AI.

In the end you would be correct, if I don't do anything about it, the game itself is going to be translated but my mod not. (at least as long as the translater respects my wish)

But that's why, I am working now, to create a template, that translaters can use to translate my mods without the NEED to use LLM/AI.
But it is not as easy as it may sound...