What's new

[WIP - Full] [RJ181931] Succubus Rhapsodia (English) -- ON HIATUS; UP FOR ADOPTION 2018 --


Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
Since we have the monster name, Splice will pull the exact file it needs by searching for "/ENG_Scripts/eval_scripts/LesserSuccubus.txt", no need to scan additional text files
Of course! Awesome.

There is quite a lot of old code to refresh on my side, but it's going smoothly. For now I'll keep gathering strings, and reinstating the original sentence as a comment (sometimes I had neglected that). Then I'll hunt down the bits I've missed, and the pieces that moved.
 

xRoguex

Member
Joined
Sep 26, 2021
Messages
45
Reputation score
12
Success!
View attachment 44803
View attachment 44802

This ended up being the code that finally got the file load working:

Ruby:
module ENG_Splice
    @@STR_DB = ""
 
    def self.STR_DB
        @@STR_DB
    end
 
    def self.setSTR_DB(val)
        @@STR_DB = val
    end
 
    def injection(tx, monstername)
        file_path = File.dirname(__FILE__) + "/ENG_Scripts/eval_scripts/LesserSuccubus.txt"
        self.setSTR_DB(File.read(file_path))
        #STR_DB = eval(STR_DB) # based 20-year-old Ruby workaround
        if defined?(tx["tx1"])
            if File.exists?(file_path)
                tx["tx1"] = @@STR_DB
            end
        end
        if defined?(tx["tx2"])
         
        end
     
        return tx
    end
end

You might be wondering why File.read is suddenly working. I'm not sure either but I ended up finding some obscure post about using class variables within modules so I created a setter for STR_DB and suddenly no more syntax error. That's a huge fucking weight lifted. Now I can focus on tidying up the Python and getting Splice to pull the correct file for each monster, injecting it correctly (there's some pathing issues I need to sort out regarding Splice's location), then it's just a matter of actually starting the translation.

Edit:

For posterity's sake, here's an example showing an actual translation that has been pulled from STR_DB's hash (or, more specifically, the .txt file that was then loaded and eval'd into the STR_DB hash):
View attachment 44804
And the updated code that includes the eval:

Ruby:
module ENG_Splice
    @@STR_IN = ""
    @@STR_DB = {}
  
    def self.STR_IN
        @@STR_IN
    end
  
    def self.STR_DB
        @@STR_DB
    end
  
    def self.setSTR_IN(val)
        @@STR_IN = val
    end
  
    def self.setSTR_DB(val)
        @@STR_DB = val
    end
  
    def injection(tx, monstername)
        file_path = File.dirname(__FILE__) + "/ENG_Scripts/eval_scripts/LesserSuccubus.txt"
        self.setSTR_IN(File.read(file_path))
        self.setSTR_DB(eval(@@STR_IN))
        if defined?(tx["tx1"])
            if @@STR_DB.key?(tx["tx1"])
                tx["tx1"] = @@STR_DB[tx["tx1"]]
            end
        end
        if defined?(tx["tx2"])
          
        end
      
        return tx
    end
end

And here's what the .txt file contains:

{"「うふふっ♪\n いいのかな~、そんな事言っちゃって~\\H\n 他の娘が怒っちゃうよ?」" => "\"Hehehe! ♪ Is it really okay for you to be chatting\n me up~?\\H The other girls will totally get mad,\nyou know?\""}
Well good job.
With this system the #(myname) and #(target) for example they will work the same when you put them in a dialogue?
Because If the system fails to read the pattern you obviusly see only for example #(myname) instead of your actual chara name.
Another thing if it can be useful... I noticed the hero dialogue has the same dialogues of the lesser succubus when I saw it but you can check it if I'm right or not.
 

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
That should do it for 魔_Force English.rb, fully up to 2979 snuff. I'll still need to revise it later, fill up the gaps.. The redraws one is next, soon(TM?).

I'll need a bunch of playtesting at some point; for instance I run male and solo 95% of the time. Complicated holds, elusive skills and abilities... It'll help a lot to test all of that, for bugs and missing vocabulary.
With any luck (or booze), I should have the whole of my patch updated in a week or two.
 

Attachments

Joined
Sep 21, 2020
Messages
81
Reputation score
39
Ok, I'm comfortable uploading this now in its current state. I've attached the python script and the splicer. To install it, place the Mod folder into your game directory. Here's the features / workflow of it:

1. Scan every Talk .rb file for unique dialogue (both Mod_Talk and System/talk)
2. Process all unique dialogue into .csv files for easy translation (located in Mod/ENG_Scripts/)
3. Convert .csv files to ready-to-inject .txt files (located in Mod/ENG_Scripts/eval_scripts/)
4. Process every Talk .rb file to prep for injection by injecting a small script at the top of each one
5. Reads ready-to-inject .txt files and processes them into a hash which is loaded into the game, replacing the Japanese text

Everything is handled through the python script (aptly named English_Patcher.py).

In short, it's now possible to just translate line-by-line in the clean .csv files and the script will process everything else provided you've run options 1, 2, and 3 at least once. (You shouldn't run option 1 more than once unless an update modifying the Talk scripts comes out).

What that also means: the English patch as far as Talk dialogue goes will be a bundle of ~150 .txt files with the largest barely exceeding 512KB, none of which touch any of the game files. The only thing modified in the game files is the small script injection performed by the python which is (should be) harmless and update agnostic.

As far as I can tell with my limited testing this seems to function perfectly, but I've also been debugging it for like 12 hours now and may have missed some stuff so if any bugs are found please let me know.

Some trivia--SisterSuccubus is the largest of all the monster dialogues at a whopping 526KB and approx. 3250 lines of unique Talk dialogue.

And just as a fun comparison, here's what the average translator's workstation looked like before:
6Pn3tl3[1].png
And here's what the new and improved set-up looks like:
cejreTs[1].png

Some minor to-do stuff I may tackle at some point is finding a way to improve how the .csv files look. But it's completely functional now, so I'll probably start work on translating the first battle's text instead since it's (unfortunately) one of the largest in the entire game. LesserSuccubus, for some reason, is absolutely massive, ranking at #3 overall for unique lines.

Edit:

Disregard, removed the attachment temporarily. There's a rather nasty bug regarding string interpolation and eval inside of ENG_Splice.rb that I need to resolve.

On further review this is going to take a possibly large rewrite of Splice and possibly part of the python file. It's less of an issue with string interpolation and more of an issue with eval being unable to access the interpolated variables. I'll probably be shifting the eval of the hash over to the monster file where the script is injected so that eval has access to those interpolation variables.

But I'm going to take the next few days off. My brain needs time to recuperate after the nightmare that was getting the rest of this functioning, and I'm also moving so I'll be busy anyway.
 
Last edited:

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
My brain needs time to recuperate after the nightmare
No worries I'll keep striking the iron so it remains hot ;) there's still a lot I need to do to pave your (future) way.
I missed your upload, so I can't really help; assuming I could have. You've tackled one of the longest/hardest parts straight away, to be fair.
edit
the #(myname) and #(target) for example
The answer is in the name, splice.
What goes into the box is:
Python:
# not actually
IN = "「#{target}が脱ぐところ、見せてぇ\\H\n ね、#{myname}も裸だし、いいでしょ?\\H」"
# but
IN = [target,
"が脱ぐところ、見せてぇ\\H\n ね、",
myname,
"も裸だし、いいでしょ?\\H"]
# then
for i in IN:
    isinstance(i, str) ? SR_Translate(i) : SR_Convert(i)
# I suppose  ʕ·ᴥ·ʔ?
That's the more elegant solution, over my/Ruby's usual stone age tools. I'll have to keep up not to be a liability.
There's also the side benefit of external code, that we salvage the otherwise doomed "\w", "\m", etc.
Ruby:
"\w\x\y\z" == "wxyz" #true...
.rxdatas will be another matter, like T++ users learned the hard way.
When we get there, we'll probably need a hand looking for the elusive text global methods cannot catch.
 
Last edited:
Joined
Sep 21, 2020
Messages
81
Reputation score
39
So I know I said I was going to take a break but this problem had been nagging me so I've been working on it throughout the day.

Actually xRoguex was surprisingly on the dot with the problem, perhaps not intentionally since it'd be pretty impressive without seeing the code. eval had an issue with reading string-interpolated variables because it didn't share the same scope as the monster Talk files. This ultimately resulted in the program crashing and several frustrating hours of basically nuking the Splice program entirely and shifting the code into the monster files. However, in doing so...

yEmQCWo[1].png jApnVd5[1].png
String interpolation is now functional with no workaround in the translation .csv necessary (in fact the only thing you have to change is the escaped quotation marks as shown in the screenshot). I also upgraded to a new .csv editor because the old one was blinding me. This new one is significantly easier on the eyes and lets me swap between .csv files on the left.

The cherry on top, I stress tested one of the worst case scenario scripts (which happens to be LesserSuccubus, as it turns out) provided all ~3250 of her lines were translated and the game tries to parse the .txt file.
Qy8PY7v[1].png

The result is imperceptible when compared to untranslated gameplay, which means this method should be ready for translation now. I just need to update the python and have it inject to all the other files. If the injection goes smoothly, I'll upload the python script here (ENG_Splice.rb is no longer in use and will be deleted. The python directly injects about 16 lines of unique code into the files now instead).

Edit:

Ok, the injection seems to have gone perfectly. I've attached the python script. If there's questions about what something does or how to use it, please ask.

There's 3 options included with it.

The first option assembles .csv files with unique lines in the name of the monster.
The second converts those .csv files to formatted .txt files ready to be eval'd into a hash in Ruby. This should be run whenever you have updated the .csv files or the text won't appear in-game.
The third option inserts the injection script into all of the Talk files.

Options 1, 2, and 3 should all be run at least once. Don't run 2 before 1 obviously because there won't be any .csv files for it to convert. I'm not sure what happens if you run option 3 without the other 2 (IOW, no text file is present). It'll probably crash, so make sure you run all 3 before trying to run the game. I should also add, do not run 3 more than once. I haven't included a check for the injection script yet so it will likely create duplicates of the injection script instead of replacing it. And make sure you have an original backup if something goes wrong.

I also forgot to add, the python script must be run inside of your /Succubus Rhapsodia/Mod/ folder. Don't try to run it inside anything else.

Let me know if you find any bugs / improvements.

I'm going to start working on fully translating the fight now, or at least most of it.
 

Attachments

Last edited:

xRoguex

Member
Joined
Sep 26, 2021
Messages
45
Reputation score
12
So I know I said I was going to take a break but this problem had been nagging me so I've been working on it throughout the day.

Actually xRoguex was surprisingly on the dot with the problem, perhaps not intentionally since it'd be pretty impressive without seeing the code. eval had an issue with reading string-interpolated variables because it didn't share the same scope as the monster Talk files. This ultimately resulted in the program crashing and several frustrating hours of basically nuking the Splice program entirely and shifting the code into the monster files. However, in doing so...

View attachment 44818View attachment 44819
String interpolation is now functional with no workaround in the translation .csv necessary (in fact the only thing you have to change is the escaped quotation marks as shown in the screenshot). I also upgraded to a new .csv editor because the old one was blinding me. This new one is significantly easier on the eyes and lets me swap between .csv files on the left.

The cherry on top, I stress tested one of the worst case scenario scripts (which happens to be LesserSuccubus, as it turns out) provided all ~3250 of her lines were translated and the game tries to parse the .txt file.
View attachment 44820

The result is imperceptible when compared to untranslated gameplay, which means this method should be ready for translation now. I just need to update the python and have it inject to all the other files. If the injection goes smoothly, I'll upload the python script here (ENG_Splice.rb is no longer in use and will be deleted. The python directly injects about 16 lines of unique code into the files now instead).

Edit:

Ok, the injection seems to have gone perfectly. I've attached the python script. If there's questions about what something does or how to use it, please ask.

There's 3 options included with it.

The first option assembles .csv files with unique lines in the name of the monster.
The second converts those .csv files to formatted .txt files ready to be eval'd into a hash in Ruby. This should be run whenever you have updated the .csv files or the text won't appear in-game.
The third option inserts the injection script into all of the Talk files.

Options 1, 2, and 3 should all be run at least once. Don't run 2 before 1 obviously because there won't be any .csv files for it to convert. I'm not sure what happens if you run option 3 without the other 2 (IOW, no text file is present). It'll probably crash, so make sure you run all 3 before trying to run the game. I should also add, do not run 3 more than once. I haven't included a check for the injection script yet so it will likely create duplicates of the injection script instead of replacing it. And make sure you have an original backup if something goes wrong.

I also forgot to add, the python script must be run inside of your /Succubus Rhapsodia/Mod/ folder. Don't try to run it inside anything else.

Let me know if you find any bugs / improvements.

I'm going to start working on fully translating the fight now, or at least most of it.
Well based on my light experience in these kind of stuff when you try to put something between two things connected as far as I remember you need to hook the first and the second and let the base program in the game read the new pattern. I know my technical explanations in english are lacking a lot but is something that I've been always told years ago when I started to "change things" for fun with a with friends. Well time flies.
That was the reason because I went straight to translate the dialogues in the .rb files. But I'm still an ignorant in these kind of stuff but I will tell you if I find anything useful again.
Maybe if I have time I can really start to learn something about ruby, who knows. Good job btw.
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
Just an addendum, I've tested Translator++ and it was successful alongside your scripts Strange (albeit I only pulled the CommonEvents file and the Map files since abilities, armors, etc. are handled externally). Worked perfectly on a fresh copy which is very nice, so I'm going to continue working on map translation as well now too.
 

xRoguex

Member
Joined
Sep 26, 2021
Messages
45
Reputation score
12
Just an addendum, I've tested Translator++ and it was successful alongside your scripts Strange (albeit I only pulled the CommonEvents file and the Map files since abilities, armors, etc. are handled externally). Worked perfectly on a fresh copy which is very nice, so I'm going to continue working on map translation as well now too.
Maybe you've noticed already but in the CommonEvent files there are things like AP absorption and Sucking if I remeber correctly that they give you an error but the game won't crash.
For these things you need to be defeated by a succubus and see if it gives you that error but i suppose they are some system names. It's the only thing I can remember for now for that file.
 

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
the CommonEvents file and the Map files
Yes, these can be fine. I tried 2-3 times before. But you probably used T++ more often and longer than I did. In any case, whatever T++ breaks can be fixed.
You just have to tread much more carefully than with the average game. And updates will be b*tches but let's not mention that.

edit/A few subjective remarks/questions:
- is the wordwrap necessary? in your lessersuccubus example, I like the original disposition better:
Code:
「うふふっ♪
 いいのかな~、そんな事言っちゃって~❤
 他の娘が怒っちゃうよ?」
- Maybe a dumb concern, but the substitutions will take place after the wordwrap, right? Won't "myname -> Lesser Succubus" make the line too long, then? (ie cut off/condensed)
- I think the 「 」 look good; better than our boring English "quotation marks". But that's a personal bias (NGNL's 空白. And \" is annoying to type)

I'm just raising these points since it's better to mention them earlier. Your thoughts?
Side benefit from your code: You took a thorn out of my side. Namely, the ability_name.rb they had stashed in various \Graphics\Battlers\O_MOD folders.
Python:
# needs to be run from \Graphics\Battlers\O_MOD

text = []
#lutz - https://stackoverflow.com/questions/954504/how-to-get-files-in-a-directory-including-all-subdirectories
for dirpath, dirnames, filenames in os.walk('./'):
    if exists(os.path.join(dirpath, "ability_name.rb")):
       print(dirpath)
       fp = open(os.path.join(dirpath, "ability_name.rb"), 'r', encoding='utf-8', errors='ignore')
       for line in fp:
            # write_csv({line.lstrip(" ") : "\"\""}, "ability_names.csv")  # also worked out
            text.append(line)
text = set(text)
with open("ability_names.rb", 'a+', encoding="utf-8") as file:
    for i in text:
#        i = "[\"" + i + "\", \"\"],"
        file.write(i + "\n")
And I finally have these 163 unique abilities in the database! 🥳 (+the wielding succubi for reference)
 
Last edited:
Joined
Sep 21, 2020
Messages
81
Reputation score
39
- is the wordwrap necessary? in your lessersuccubus example, I like the original disposition better:
Code:
「うふふっ♪
いいのかな~、そんな事言っちゃって~❤
他の娘が怒っちゃうよ?」
I'm not sure I follow what you're saying here? The word wrap (\n) is currently placed no more than 53 characters in with every line. It's impossible to maintain the same character wrapping as the Japanese version does for every sentence if you mean placing line breaks exactly where they do, so don't get too worked up over that. Some compromises have to be made in the wrapping. But I do try to fit similar line breaks where I can, assuming it's possible with the limited character space.

If the original game's wrapping is different from the wrapping in the untranslated version with the patcher applied then let me know ASAP with screenshots because there could be something wrong with the eval that needs to be examined.

Maybe a dumb concern, but the substitutions will take place after the wordwrap, right? Won't "myname -> Lesser Succubus" make the line too long, then? (ie cut off/condensed)
Interpolation happens before the sentence is displayed. You can have a 14 million character line and nothing would break until it was displayed. It's therefore up to the translator to avoid writing lines that are too long.

However, and I was meaning to bring this up, {myname} needs to be removed regardless from any translated text. It does not resolve to "Lesser Succubus." It resolves to their variation of pronoun in Japanese as far as I have seen. E.g. アタシ、私、我、etc. English does not have this concept of a masculine vs. feminine vs. formal vs. informal way of saying "I". Translations should substitute {myname} with "I" where possible.

I think the 「 」 look good; better than our boring English "quotation marks". But that's a personal bias (NGNL's 空白. And \" is annoying to type)
Sorry, but I'm making an executive decision to say no on this. While I understand they have a unique appeal because you don't see them in your day-to-day life, they are simply Japanese quotation marks. As such,「」just does not have a place in an English translation.

That said, I also understand your concern with the frustration of repeated escaped quotation marks. I'll look at alternative solutions to this that should be fairly easy to implement without breaking anything.

Also, good job with the abilities. I'm glad my code was able to help you out. I'll probably continue expanding on it as I go along depending on my needs (remember, we still need to extract the skill text too). A similar method is prooooobably possible but I haven't really looked at it. I guess I could do that tomorrow.

If you have any ideas for similar implementations that would help out on your end let me know and I will take a look.
 
Last edited:

xRoguex

Member
Joined
Sep 26, 2021
Messages
45
Reputation score
12
However, and I was meaning to bring this up, {myname} needs to be removed regardless from any translated text. It does not resolve to "Lesser Succubus." It resolves to their variation of pronoun in Japanese as far as I have seen. E.g. アタシ、私、我、etc. English does not have this concept of a masculine vs. feminine vs. formal vs. informal way of saying "I". Translations should substitute {myname} with "I" where possible.



Sorry, but I'm making an executive decision to say no on this. While I understand they have a unique appeal because you don't see them in your day-to-day life, they are simply Japanese quotation marks. As such,「」just does not have a place in an English translation.

That said, I also understand your concern with the frustration of repeated escaped quotation marks. I'll look at alternative solutions to this that should be fairly easy to implement without breaking anything.
I add a thing that I noticed aswell. The actual text in the .rb files the dialogues for every character that implement "#(target) and the target is the MC is 95% made for the male protagonist.
I'll give you a few examples: when a fellow succubus is the target is "anata" or "kijo" or words like this and they all means "you" to us so for that kind of dialogues I'm totally agree to replace it. For the MC even if you choose to be a female or futa is "onii-san" or pretty much something like this.
Even the text is for the male MC so you'll see frequently onii-san when a succubus talks to you (not in battle) and in the text there is no (target) pattern.
For the (myname) I honestly didn't find any issues for now.
I'll throw an idea but I dunno if is doable: are you able to set something that can switch dialogues based on your gender of choice?
At the start I thought it would be better do 2 separate translations for the maps and for the 00_System base folder, but you can change your gender when you want while you play so thought if could be possible to keep both the folder and put an "if" string that can do the trick.
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
I add a thing that I noticed aswell. The actual text in the .rb files the dialogues for every character that implement "#(target) and the target is the MC is 95% made for the male protagonist.
I'll give you a few examples: when a fellow succubus is the target is "anata" or "kijo" or words like this and they all means "you" to us so for that kind of dialogues I'm totally agree to replace it. For the MC even if you choose to be a female or futa is "onii-san" or pretty much something like this.
Even the text is for the male MC so you'll see frequently onii-san when a succubus talks to you (not in battle) and in the text there is no (target) pattern.
For the (myname) I honestly didn't find any issues for now.
I'll throw an idea but I dunno if is doable: are you able to set something that can switch dialogues based on your gender of choice?
At the start I thought it would be better do 2 separate translations for the maps and for the 00_System base folder, but you can change your gender when you want while you play so thought if could be possible to keep both the folder and put an "if" string that can do the trick.
It would take rewriting the actual code of the game which I am not particularly interested in. As it is, the translation .csv files do not touch the code at all outside of string interpolation (e.g. {myname}). The patcher also does not modify code, it only adds to it (and in as much of a non-invasive way as possible).

But yes, like you said the overwhelming majority of text is duplicated for all gender options. I haven't looked at {target} closely yet but if that's the case then it also needs to be removed and instead translated based on the context of the character's dialogue.
 

xRoguex

Member
Joined
Sep 26, 2021
Messages
45
Reputation score
12
It would take rewriting the actual code of the game which I am not particularly interested in. As it is, the translation .csv files do not touch the code at all outside of string interpolation (e.g. {myname}). The patcher also does not modify code, it only adds to it (and in as much of a non-invasive way as possible).

But yes, like you said the overwhelming majority of text is duplicated for all gender options. I haven't looked at {target} closely yet but if that's the case then it also needs to be removed and instead translated based on the context of the character's dialogue.
Rewriting codes takes a lot of time too. If I remember correctly there are (myname), (target), (partner), (speaker) and (master). (target) for succubus to succubus talk can be replaced with "you" maybe for all the succubi. I'll check if this is the case for every succubus and the (target) words are all in the 00_System talk folder.
(partner) is the name of the MC's partner in fights.
(speaker) is the name of the succubus and (master) is the MC name when the storyteller talks. (dunno if storyteller is the right word btw forgive me:rolleyes:).
If you can, try to keep (myname) in the texts meanwhile i will check all the System base talk files and i'll tell you if there are exeptions. I probably write it in a text note and i'll attach in my next post.
I think tomorrow it will be ready.

EDIT: I forgot there are also (giggle), (gilggle_s), (pleasure), (kiss) and others like these. And last there is \\H and it's the heart you see in chat but this is an easy call.
 
Last edited:
Joined
Sep 21, 2020
Messages
81
Reputation score
39
I might just look at a way to substitute where those are defined in the script and substitute it there, that way if we ever want to change it up it's only like 40 lines instead of thousands we need to go back and change.

In other words, leaving the interpolation inside the dialogue and change the variable instead.

Edit:

Also, as the DLSite is basically endorsed by the author of the game [Deleted the twitter post, you can search for Wix's twitter if you really need to verify but it eats up too much of the page.] and it lists the protagonist as "Lauratt" and the master as "Raamil", I'll be going with those two translations. I think it's better this way regardless for the sake of cohesiveness between the MGQ Paradox translation which has multiple recurring characters from this game too.

As far as installation of the mod goes, I think we need to condense the process into something simple.

E.g. "Drag and drop the downloaded Mod folder + System folder into your game directory." As it stands I believe this actually works from my testing of the English-translated maps. Anyway, my point being I'd rather us not make the installation process more complicated than necessary with moving mod files to the base directory, if possible.

Edit 2:

I've been pretty thoroughly examining Skilltext for some ideas on how to approach inserting the English text. To better explain, it's easier if I break down how Skilltext.rb actually functions.

Basically every action assignment can have up to approx. 4 components.
  1. action = premess + "<string>"
  2. An action.gsub!("", "")! call which replaces a substring in the aforementioned action
  3. action += "" which appends to the end of the current action string.
  4. waist/point/some other array in the form of :
    1. Ruby:
      waist = ["random1", "random2", "random3"]
      waist.push("random4", "random5")
      waist = waist[rand(waist.size)]
      #action = (string using the interpolated waist variable, i.e. #{waist})
There are some variations to this. For example, I've seen at least two calls to SR_Util, specifically self.bust_translate(action) which is literally just action.gsub!("", "") embedded in SR_Util for some reason.

Unfortunately, because the sentences are constructed this way, I'm not sure it's possible to avoid manually translating Skilltext line-by-line. Just to give an example, if I get "愛撫している!" I don't know what part of the sentence that text is going into without looking at the original code, if that makes sense.

This is ultimately a non-issue because it's a single file which can be easily compared with a file/text-diff program after a patch, but it's still sort of annoying nonetheless. Anyway that's what I got from examining the skilltext. If there's any other observations, let me know.

Also, it looks like {myname} actually does more commonly resolve to the creature name in Skilltext so that'll need to be examined more closely before we start removing {myname} altogether.

Edit 3:

Also, an explanation of what exactly is causing the characters to disappear when used with \w, \m, etc. within the slice loop would be nice. Is this something inherent to RGSS? Is there any documentation I can read about this already in existence or is this something I need to dig into?
 
Last edited:

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
I'm making an executive decision to say no on this. While I understand they have a unique appeal because you don't see them in your day-to-day life, they are simply Japanese quotation marks. As such,「」just does not have a place in an English translation.
A sound argument (except I do see 「」on most days, esp. now). But I won't mention that again. I do like them but they indeed do nor belong in an English sentence; or arguably, only to emphasize one specific word which must sound 'Foreign' in context.
However, consider the alternatives to the quotes. Like the simple -
- hi! I am a dialogue!
Or even no punctuation at all! since we have a "speaker" clearly defined each and every time, like in a VN, dialogue can be implicit.
I don't really mind either way, but avoiding the potentially string-breaking " is a good incentive, if only for your peace of mind.

(some obsolete lines follow, as you've already answered/noticed most points)
As for the talk foder, target and myname are pretty much useless, you're right. "You" is invariable in English, and were she to use "Kisama",etc. this would need to be reflected in another way. The same goes for the various Japanese 'I'. I also know from experience, adjusting every single line length manually, can hardly be called productive.
But I'm not sure taking out the "if .+" was a good thing; they're the context, along with the footnotes/comments. I certainly couldn't do without them, at my level.

I doubt any clever solution exists to globally help with the 'technical' battle log. Skilltext, or even state text as prime examples.
- There are simply too many exceptions to simply extract pieces of strings
- there are many substitutions; but even simple ones like gsub!("アソコ","菊座") would often require rewriting more than one word, up to the whole sentence (so they need some code on top of the TL)
- there's a lot of all-important context, which can hardly be exported. With so many appendages and situations around, it'll get way too confusing.
Updates won't be that much of an issue, in comparison. This is "only" a text-maker script after all.

-> I believe there'll be no choice but to work on a clone of the file. We could drastically reduce the content, alternative phrasings, etc. to make do, but...
A simple way could be to overgo most sub functions (gsub!), and separating the line into 2-3 conditional others. I could have a look at every external reference, and see what they encompass; like you said most of them are very simple, and the others point to the database (so either I/we have the tool already, or I can make one). They won't be a big deal, but they'll prevent a global draw tool for the entire process.
There's little point comparing how the Talk folder works, with skilltext or most of the remaining code. The {myname} here and there are unrelated completely (as most other subs). Two different jobs, barely related.
-> in the talk folder you can safely ignore most of the symbols. Most of them can be mass replaced for readability (#{myname}->ME, "{target}*>YOU, etc.) if you like. That's the greatest advantage of a centralized database, such as your .csv.
Do not hesitate to tell if anything I've translated myself caught your eye as especially shocking. I consider any and all of my TR temporary cardboard patches; some of them (仮名 especially) I've thoought hard about, but not all. Kanjis carry history, meaning and thoughts I seldom can fathom.
My top 3 worst TLs:
精神力 -> MAG/Magic. The initial reason is barely valid anymore. Would you second using WIL/willpower? (there's MND/mind but it's assigned to the barely used mdef).
骨抜き -> Weak. I understand well what it means - I often work with fish fillets and sometimes read about spineless MCs. But a proper English word keeps eluding me.
ディバウアー -> Devour. I went with it for the phonetic fit, but I woudln't call it 'fitting': I don't understand the idea/logic behind it.

These are not urgent, they'll involve a bit of cross-checking at any stage. But I'd rather remove ASAP anything which can be deemed an 'eyesore'.
 
Last edited:
Joined
Sep 21, 2020
Messages
81
Reputation score
39
only to emphasize one specific word which must sound 'Foreign' in context.
I'm actually using the 『』 quotation marks in these specific instances since English doesn't have an equivalent. Technically we have a partial equivalent in the form of '' but they aren't all encompassing for the purposes 『』are used for. For example, from the intro: 『Dream Interference』. In English, with the titles of works, we use several different forms of text formatting depending on the work. Some of these aren't available in RGSS unfortunately. I could look at scripting them in, and I might, but this isn't in the cards right now.

Or even no punctuation at all! since we have a "speaker" clearly defined each and every time, like in a VN, dialogue can be implicit.
You do make a good point about removing quotation marks since dialogue is tagged regardless. This is already done in map dialogue so I'll start doing this in combat dialogue as well actually.

But I'm not sure taking out the "if .+" was a good thing; they're the context, along with the footnotes/comments. I certainly couldn't do without them, at my level.
I don't need them personally. If you feel you need them for other code you're running outside of Talk, I've already tagged the line with a comment that removes them. I personally will not be adding them to the .csv files because they're extraneous and the Japanese lines can get long enough as is, with some of them already causing my .csv editor to create a second row with word-wrapping to fit them on the screen.

I doubt any clever solution exists to globally help with the 'technical' battle log. Skilltext, or even state text as prime examples.
Yeah, that's the point I'm at. I've duplicated the O_Mod skilltext file and have changed it to 魔_English_MOD_RPG_Skilltext.rb instead to work out of that. There's too many substitute calls to reliably translate the text into English because all of the substitutions were made with Japanese in mind. Doing the same thing with the Talk files isn't possible in this case.

I'll do a second pass of the translations when everything is said and done. I'm not worried about nitpicking every line at this stage. Getting the core stuff down and plugging along is best.

Edit:

I've alluded to it, there's some talk about that starting page 2. And we'll definitely need to talk about this before you tackle skilltext, and the rest.
The code itself is in "class Window_BattleLog < Window_Base", in its "def refresh". There's a copy in my 魔_English_redraws.rb. That's the infamous "while ((c = text.slice!(/./m)) != nil)" loop.
Once I have the code updated, (and perhaps the database) I'll need tot tackle this. That will imply choices about the flow control symbol you've seen, like '\w' for 'wait'.
Some write-up of what's going on here would be nice, as I've only continually seen vague allusions to this issue. I've tried digging around through various threads now and have not actually seen anyone talk about what's actually causing this issue in the slice loop or why it's "infamous".
 
Last edited:

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
Edit 3
Also, an explanation of what exactly is causing the characters to disappear when used with \w, \m, etc. within the slice loop would be nice. Is this something inherent to RGSS? Is there any documentation I can read about this already in existence or is this something I need to dig into?
I've alluded to it, there's some talk about that starting page 2. And we'll definitely need to talk about this before you tackle skilltext, and the rest.
The code itself is in "class Window_BattleLog < Window_Base", in its "def refresh". There's a copy in my 魔_English_redraws.rb. That's the infamous "while ((c = text.slice!(/./m)) != nil)" loop.
Once I have the code updated, (and perhaps the database) I'll need tot tackle this. That will imply choices about the flow control symbols you've seen, like '\w' for 'wait' (「if c == "\w"」in that loop. )
Cf my "\016","\017","\020" attempts which could be a solution for a more global marking. In the 1st/2nd cases I scanned the string for existing names and injected a "\symbol" to mark them as 'don't touch' words. This is why you can name a girl 'Mimicry' and her name won't show as "Miicr" during battle, when using my patch.

The big choice will be: will we keep RPGMXP's character-by-character text flow?
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
I've alluded to it, there's some talk about that starting page 2. And we'll definitely need to talk about this before you tackle skilltext, and the rest.
The code itself is in "class Window_BattleLog < Window_Base", in its "def refresh". There's a copy in my 魔_English_redraws.rb. That's the infamous "while ((c = text.slice!(/./m)) != nil)" loop.
Once I have the code updated, (and perhaps the database) I'll need tot tackle this. That will imply choices about the flow control symbols you've seen, like '\w' for 'wait' (「if c == "\w"」in that loop. )
Cf my "\016","\017","\020" attempts which could be a solution for a more global marking. In the 1st/2nd cases I scanned the string for existing names and injected a "\symbol" to mark them as 'don't touch' words. This is why you can name a girl 'Mimicry' and her name won't show as "Miicr" during battle, when using my patch.

The big choice will be: will we keep RPGMXP's character-by-character text flow?
This seems like it was blown up into way more of an issue than it actually is. I'll take a look at it in depth tonight.
 

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
This seems like it was blown up into way more of an issue than it actually is. I'll take a look at it in depth tonight.
It was 😅
Personally I faced this 1st on the earlier, more complicated SQ, with little to no Ruby knowledge/know-how. Fun times.
Anything becomes easy eventually, but it'll still be tedious: we'll need to edit the existing strings no matter what, as Ruby will lose the \ in \w or \m.

I'm looking forward to your opinion, but don't lose sleep over it! we already did
 
Top