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
Practical example of aliases:
Ruby:
module RPG
  class Ability_registration
    alias clown_setup setup
    def setup(ability_id)
      UK_setup(ability_id)
      clown_setup(ability_id)
    end
  end
end
This removes the need to insert the UK_setup line manually... I should've done that much earlier. I feel like a bit of an idiot now :unsure:

So, I went and implemented 2975... And everything seems to be working perfectly fine? Including the bed battle, both the old and the new, fruit-granting new one?
Granted, I couldn't playtest everything, many menus are sligthly messed up, abilities were shuffled again... but nothing gamebreaking, is a load off my chest already. If that's really required/helpful I could update my stuff to the latest patch smoothly.

I'm really happy with the gorgeous Dreamland art crawling in; it fits Rhapsodia to a T.
The fundations for post-Aurum content are also good news, buuut that means the modders are still going at it (so moar work for us too). The monsters, I luv' em 😘
Scrpm_2979 just dropped in the meanwhile to show my point 😅

On that note, remember the rxdata files are also updated with every single new mod file: the files you moved out of Mod_Data. Be especially wary about enemies and skills; maps are easier to keep track of. Good luck!
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
Practical example of aliases:
Ruby:
module RPG
  class Ability_registration
    alias clown_setup setup
    def setup(ability_id)
      UK_setup(ability_id)
      clown_setup(ability_id)
    end
  end
end
This removes the need to insert the UK_setup line manually... I should've done that much earlier. I feel like a bit of an idiot now :unsure:

So, I went and implemented 2975... And everything seems to be working perfectly fine? Including the bed battle, both the old and the new, fruit-granting new one?
Granted, I couldn't playtest everything, many menus are sligthly messed up, abilities were shuffled again... but nothing gamebreaking, is a load off my chest already. If that's really required/helpful I could update my stuff to the latest patch smoothly.

I'm really happy with the gorgeous Dreamland art crawling in; it fits Rhapsodia to a T.
The fundations for post-Aurum content are also good news, buuut that means the modders are still going at it (so moar work for us too). The monsters, I luv' em 😘
Scrpm_2979 just dropped in the meanwhile to show my point 😅

On that note, remember the rxdata files are also updated with every single new mod file: the files you moved out of Mod_Data. Be especially wary about enemies and skills; maps are easier to keep track of. Good luck!
So I spent yesterday afternoon pondering some different ideas on how to override the modded SR_Util and when I started to implement them I realized there's not a significant difference in the way I'd be handling it versus your own (even down to including a character in the filename to force the English to load after the other mods lol). So I'll just incorporate your own scripts into the game and that way we can work off of something consistent and I'm not re-inventing the wheel.

Anyway, your patch is currently not functional at the moment. There's at least two files in your patch that are significantly out of date which are modifying the Mod's files: O_MOD_口上メソッド_基本.rb and O_MOD_Scene_Title.rb. Both of these files are missing large chunks of code or have outdated code and cause the game to crash if added. I'm going to continue reviewing each of the files in 2975 vs. your patch to check for more outdated code.

Edit:

Ok, so basically everything in your patch is outdated. Instead what I did was copied the orphan files over from your patch to the Mod_Scripts folder and that resolved the issue. It'd probably be prudent to remove any unnecessary files from the download.

That said, from what I can see just from the tutorial battle, basically everything looks good to go from my own 2979 installation, so I'll start working on getting the rest of the battle stuff translated for the tutorial just to make sure it's functional with the update.
 
Last edited:

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
Anyway, your patch is currently not functional at the moment. There's at least two files in your patch that are significantly out of date which are modifying the Mod's files: O_MOD_口上メソッド_基本.rb and O_MOD_Scene_Title.rb. Both of these files are missing large chunks of code or have outdated code and cause the game to crash if added. I'm going to continue reviewing each of the files in 2975 vs. your patch to check for more outdated code.
I'm aware. That's what I got on my plate right now: crosschecking every single line of my log, and see what has changed.
Then I either delete my own code and rewrite it, or append it if nothing much is new. Tedious.
Like I said I encountered almost nothing gamebreaking; I won't look for bugs endlessly, since I intend to verify every single of my lines anyway. Woe is me. But at least I trust the jp modders not to leave any notable bug behind.

edit: in short, you're absolutely right, and shouldn't edit the files from the .atc directly. But working on a clone works out.

You should only use my own files - those listed in the spoiler. What you experience with the others is what happens with every patch. You're supposed to overwrite every single old file when you add a new patch from scrpwiki.net/mod/uploader/. That was the initial point of my useless changed_files__log.txt, but I changed the method since, for a standalone patch instead - as I'm trying to say.


edit: Armors and abilities database, 100% updated to 22/07/18's scrpm_2979.atc. 99% somewhat English.
I still have to decide what to do with "symbols" like [胸→口].
 

Attachments

Last edited:
Joined
Sep 21, 2020
Messages
81
Reputation score
39
I'm aware. That's what I got on my plate right now: crosschecking every single line of my log, and see what has changed.
Then I either delete my own code and rewrite it, or append it if nothing much is new. Tedious.
Like I said I encountered almost nothing gamebreaking; I won't look for bugs endlessly, since I intend to verify every single of my lines anyway. Woe is me. But at least I trust the jp modders not to leave any notable bug behind.

edit: in short, you're absolutely right, and shouldn't edit the files from the .atc directly. But working on a clone works out.

You should only use my own files - those listed in the spoiler. What you experience with the others is what happens with every patch. You're supposed to overwrite every single old file when you add a new patch from scrpwiki.net/mod/uploader/. That was the initial point of my useless changed_files__log.txt, but I changed the method since, for a standalone patch instead - as I'm trying to say.


So far I've updated and revised the abilities and armors (attached), if you're interested. I still need to double-check for brand-new items + those I might've missed before.
Would you rather I focus on the inner scripts instead, if you have problems with them? I can leave the rest of the database for later, it's all the same to me.
Thanks for the info Strange. Tedious is certainly the word I'd use as well, and I'd like to work on making it easier for you (and consequently myself for translation). I really like how you have the original text in each of the files set up as it makes it incredibly easy for me to look at how things were translated and what still needs to be done.

I definitely appreciate the help with the database. But, the biggest thing for me is your help with the internals. Having the framework done will let me work on the translations, and I can sift through the database as needed. Basically like how you have the skills set up at the moment, with some descriptions having translations and others needing them.

Some TO-DOs stick out to me as far as the script side of things are concerned:

1. O_MOD_RPG_Skilltext.rb has battle text associated with each of the skills. For example, line 779:
Ruby:
      when 81    #キッス
        held = ""
        if myself.holding?
          held = "体勢を変えて"
        end
        case $mood.point
        when 50..100
          case myself.personality
          when "勝ち気", "腕白", "高慢","妖艶"
            action = premess + "#{held}、\n\m#{targetname}の唇を強引に奪った!"
          when "好色", "甘え性"
            action = premess + "#{held}、\n\m#{targetname}と情熱的なキスを交わした!"
          when "淡泊", "内気", "冷静"
            action = premess + "#{held}、\n\m#{targetname}の唇に、そっと唇を重ねた!"
          else
            action = premess + "#{held}、\n\m#{targetname}と濃厚なキスを交わした!"
          end
        else
          action = premess + "#{held}、\n\m#{targetname}とキスを交わした!"
          action = premess + "自らの意に反して\n\m#{targetname}とキスを交わしてしまう!" if $game_switches[722] == true #ハザマ後編MOD
        end
         # action = premess + "#{targetname}の中を突きながら、\n\口づけを交わした!" if $msg.t_target.can_mating? and $msg.t_enemy.vagina_insert? #夢幻の源泉 挿入中

action here needs to have its text substituted in English files. Presumably this would be easiest in "English_abc skills.rb" since that's where the skills are already being defined regardless.

2. I have a somewhat growing concern of the size of "魔_Force English.rb" considering its rather large number of nearly 7,000 lines. Scene_Battle, Scene_Box, and Scene_Menu are by far the worst offending classes. I'm wondering if this can be trimmed down? My reasoning is, if we use just what we need, that's less things that can break from outdated code if those classes are updated by the Mod at some point (if I'm understanding how the "魔_Force English.rb" file overriding the Mod's classes works). I'll probably toy around with this myself to see if that's possible.

And, to that end, it might be useful to know what you've modified exactly within those classes, because it's hard to tell what's outdated, copy-pasted code in 魔_Force English.rb and what's code that was purposefully changed.

3. There is a minor bug with the display of Lauratt (I'm going by the MGQ: Paradox translation, I think people here referred to him as Laurent?) and his weakness in battle. His name is displayed twice, rather than Name / Race:

Finally, did you have a repository system you preferred or something like that? I remember you saying something about not liking Git. I'll likely be making changes here too and it'd probably be easier to keep track of the script files that way. If not I can upload them here as I do them.
 
Last edited:

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
For example, line 779:
when 81 #キッス
That's the fun begins: 1 and 2 are the same issue.
In your example, you'd actually need to copy the whole 6650+ lines , starting with:
Ruby:
module RPG
  class Skill
    def message(skill, type, myself, user) # <-this is what you're actually editing
There's absolutely no way around that. In the few jumbo cases we have, like skilltext, we should simply work on a copy of the whole file.
But for the good news:
And, to that end, it might be useful to know what you've modified exactly within those classes, because it's hard to tell what's outdated, copy-pasted code in 魔_Force English.rb and what's code that was purposefully changed.
Nothing. I changed nothing at all! :p Normally these are my guidelines:
1- alter only a string itself, with no external reference and as few line modifications as possible
2- every single database reference should have the "UK_" prefix if I messed with it
1) ensures that if a patch adds/edits something, it's easy to track down (with just notepad++'s compare)
2) Ensures no internal code is actually changed - everything remains in Japanese, out of view. However, some script changes can make that difficult.

If you're interested in skilltext, there's a lot of work there. Go wild! I've left it untouched because there was much more TR work than script monkey work.
In your example, the only reference that needs be changed/redefined is "targetname". But there's more:
Ruby:
      myname = myself.name
      username = user.name
      skill_name = skill.name.split(/\//)[0]
At least these also need a parallel myself.UK_name, user.UK_name , skill.UK_name. (edit: skill.UK_name should work right away. The others, probably not; battlers are iffy and defined all over the place.)
Simply said: don't worry about it. That's easy to fix. But translating these messages out of context is too much for me; and if I had to cross-check the context every time...
So I'd really appreciate if you could take a good bite off this behemoth's toe.

3. There is a minor bug with the display of Lauratt
It's a feature! One is the class name, that's normal. It'd take 5mn to edit the script to delete the duplicate (if and only if there's one).
I think the author's intent is Laurent. It's a real name, originally French. You don't pronounce the 'T' (so it's "lowra~n")


PS: I like Github. But it hates me because I suck at working with it.
There'd be little point anyway. As you saw working on a single file can take weeks, if not months. It's much better to focus on a few files at a time, or you'll get swamped, confused and discouraged. Talking from experience. There's not really a need for github here, despite what I initially thought (along with SFrame).
 
Last edited:

Ginek

Member
Joined
Jul 7, 2018
Messages
56
Reputation score
8
Just saying, gotta commend you guys for the effort, i can't understand batshit about what you are talking about, but the efforts on trying to solve the puzzle of this godforsaken game are amazing, almost everyone i see picking this up dropped it for how complex it is to translate this thing
 

xRoguex

Member
Joined
Sep 26, 2021
Messages
45
Reputation score
12
If I understood your problem correctly you need to tinker with some O_MOD too.
I wanted to try to translate some battler dialogues but if you're going to mod them I think is useless doing it now.
So I'll keep going on translating the chara dialogues and a bad first copy of the maps.
The annoying map file for now is only the CommonEvent map data. If I upload my save for Translation++ are you able to track what variable names are already covered?
The rest like Enemies, Skills, Equip and so on, I'm not doing it ofc... but in the CommonEvents map data there are a tons of things that need to be translated.
If you can, tell me if you want the save with the full translation or the one with the "I think these are system names" untraslated.
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
That's the fun begins: 1 and 2 are the same issue.
In your example, you'd actually need to copy the whole 6650+ lines , starting with:
Ruby:
module RPG
  class Skill
    def message(skill, type, myself, user) # <-this is what you're actually editing
There's absolutely no way around that. In the few jumbo cases we have, like skilltext, we should simply work on a copy of the whole file.
But for the good news:

Nothing. I changed nothing at all! :p Normally these are my guidelines:
1- alter only a string itself, with no external reference and as few line modifications as possible
2- every single database reference should have the "UK_" prefix if I messed with it
1) ensures that if a patch adds/edits something, it's easy to track down (with just notepad++'s compare)
2) Ensures no internal code is actually changed - everything remains in Japanese, out of view. However, some script changes can make that difficult.

If you're interested in skilltext, there's a lot of work there. Go wild! I've left it untouched because there was much more TR work than script monkey work.
In your example, the only reference that needs be changed/redefined is "targetname". But there's more:
Ruby:
      myname = myself.name
      username = user.name
      skill_name = skill.name.split(/\//)[0]
At least these also need a parallel UK_myname, UK_username , UK_skill_name.
Simply said: don't worry about it. That's easy to fix. But translating these messages out of context is too much for me; and if I had to cross-check the context every time...
So I'd really appreciate if you could take a good bite off this behemoth's toe.


It's a feature! One is the class name, that's normal. It'd take 5mn to edit the script to delete the duplicate (if and only if there's one).
I think the author's intent is Laurent. It's a real name, originally French. You don't pronounce the 'T' (so it's "lowra~n")


PS: I like Github. But it hates me because I suck at working with it.
There'd be little point anyway. As you saw working on a single file can take weeks, if not months. It's much better to focus on a few files at a time, or you'll get swamped, confused and discouraged. Talking from experience. There's not really a need for github here, despite what I initially thought (along with SFrame).
I've actually also been working on a better way to externalize the Mod_Talk folder as well and have sort of wrapped up the framework for it. I've created a module that replaces ms.push(tx) with ms.push(ENG_Splice.injection(tx)) which does a few things. Duplicate lines are no longer an issue or have to be translated or even searched for. New lines are enemy independent and can be placed inside of this new module (I'll need to move it one level higher so every enemy can access it, but the images below were for testing purposes). Re-inserting the text after a patch is as simple as "replace all" for the ms.push line and inserting this module at the top of any chat files that got updated:

Ruby:
require File.dirname(__FILE__) + '/ENG_Splice.rb'
include ENG_Splice
An example of the English script injection in the thumbnails:

MA03VLi[1].png b3EIO9e[1].png

Regarding skilltext--I don't think it'd be a good idea to paste that one as-is. That's a lot of translated text that would need to be manually re-added with each patch, so something that can pull text and convert it externally of the Mod would be best imo. That's what I was getting at earlier with placing it inside of English abc_skills.rb. Investigating lines 6652 -> 6662 of O_MOD_RPG_Skilltext.rb may be worthwhile for this purpose:
Ruby:
      when "action"
        #スライム系は服=粘液に置き換える(暫定)
        #190220修正 (484の槍)
        if target.tribe_slime?
          action.gsub!("服","粘液")
        end
        text = action
      when "avoid"
        text = avoid
      end
      return text
I'd be happy to work on the text, but I think we need a better method of applying the TL beforehand. And on that note I do think several classes inside of 魔_Force English.rb need to have their copied code updated. Unfortunately I was not keeping track so I don't remember exactly which ones did but I'll make a note of them as I see them. For example, though, make_skill_action_result has significant differences (mod on left, Force English on right):
FZiaEaG[1].png

Regarding the "behemoth"--basically everything is, inevitably, pushed into the "action" variable as mentioned above from what I can tell. If we can externalize that portion of the code similar to the skills like you did with English abc_skills.rb, then I can work on translating those. I may be misunderstanding what you're referring to though. I'm not sure where skill, user, and myself are defined since those are passed through the function call, but I can take a look at that as well. Some clarification would be nice, though

If I understood your problem correctly you need to tinker with some O_MOD too.
I wanted to try to translate some battler dialogues but if you're going to mod them I think is useless doing it now.
So I'll keep going on translating the chara dialogues and a bad first copy of the maps.
The annoying map file for now is only the CommonEvent map data. If I upload my save for Translation++ are you able to track what variable names are already covered?
The rest like Enemies, Skills, Equip and so on, I'm not doing it ofc... but in the CommonEvents map data there are a tons of things that need to be translated.
If you can, tell me if you want the save with the full translation or the one with the "I think these are system names" untraslated.
I mostly need help with engine work. I don't mean to offend so I apologize if it comes across this way, but there's not really another way to say this. I don't think your English or translation skills are really up to par and it'd require me to do a lot of extra backtracking to verify your work. For example:

Original Text said:
「うふふっ♪\n いいのかな~、そんな事言っちゃって~\\H\n 他の娘が怒っちゃうよ?」
Your translation said:
「Ufufu ♪\n I wonder if it's okay~, to say something like that~\\H\n Are you serious?」
It's a very literal translation and doesn't really flow in English. The second sentence is also wrong.
他の娘 -> "The other girls"
怒っちゃうよ? -> "will get mad" (despite the question mark, this is not an actual question. It reflects rising intonation and is rhetorical)

The second sentence is closer to "The other girls will totally get mad, you know?" She's talking in a very bubbly, girly tone.
And the full sentence is more like: "Hehehe! ♪ Is it really okay for you to be chatting me up~? The other girls will totally get mad, you know?"

Also I go by Zethin on the other forum if anyone sees the name and is confused (the name is in my avatar but I made this account two years ago under a different name).
 
Last edited:

xRoguex

Member
Joined
Sep 26, 2021
Messages
45
Reputation score
12
I've actually also been working on a better way to externalize the Mod_Talk folder as well and have sort of wrapped up the framework for it. I've created a module that replaces ms.push(tx) with ms.push(ENG_Splice.injection(tx)) which does a few things. Duplicate lines are no longer an issue or have to be translated or even searched for. New lines are enemy independent and can be placed inside of this new module (I'll need to move it one level higher so every enemy can access it, but the images below were for testing purposes). Re-inserting the text after a patch is as simple as "replace all" for the ms.push line and inserting this module at the top of any chat files that got updated:

Ruby:
require File.dirname(__FILE__) + '/ENG_Splice.rb'
include ENG_Splice
An example of the English script injection in the thumbnails:

View attachment 44791View attachment 44792
I'm translating it manually and is better like this for me, so instead to create another file I'm changing the dialogues from jap to english.
When I update them instead to add files you need only to replace them. There are less risks to run into errors imo, but i'm sure you know more stuff than me regarding Ruby.
I'll keep using notepad for my translation. Btw the discord option for us who wants to bring english to this game is still up for me.
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
I'm translating it manually and is better like this for me, so instead to create another file I'm changing the dialogues from jap to english.
When I update them instead to add files you need only to replace them. There are less risks to run into errors imo, but i'm sure you know more stuff than me regarding Ruby.
I'll keep using notepad for my translation. Btw the discord option for us who wants to bring english to this game is still up for me.
In case you didn't see it, please check my edit at the bottom. I don't want you to continue spending time on something that very likely isn't going to be used. But obviously I can't stop you if you're continuing regardless. Again, I mostly need help with engine work, not the translation.
 

xRoguex

Member
Joined
Sep 26, 2021
Messages
45
Reputation score
12
In case you didn't see it, please check my edit at the bottom. I don't want you to continue spending time on something that very likely isn't going to be used. But obviously I can't stop you if you're continuing regardless. Again, I mostly need help with engine work, not the translation.
Woops sry, I missed something. I thought you were zethin btw :)
With my actual knowledge I can't really do much to help you, since the only thing I did in the past was simply to change some patterns and put it what I thought it was better... and it was years ago.
I know I'm not the best at translating from japanese but since i had time to do it, before you said something, I thought it could be fun at least try it.
Well i think i'll leave it to you then. Good luck.
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
Woops sry, I missed something. I thought you were zethin btw :)
With my actual knowledge I can't really do much to help you, since the only thing I did in the past was simply to change some patterns and put it what I thought it was better... and it was years ago.
I know I'm not the best at translating from japanese but since i had time to do it, before you said something, I thought it could be fun at least try it.
Well i think i'll leave it to you then. Good luck.
Thanks for your support! If you see a way you can help out with the Ruby / programming thing or have suggestions regarding the writing or translations, please feel free to offer them as well. I'm always happy to hear out feedback or ideas.

--

On another note, I've converted the Talk database to a hash for significantly faster look-ups (disregard the quotation mark on the second line). The proof-of-concept actually shows English text being injected now:

Sa3Kaox[1].png 45Fa351[1].png

Edit:

So I vastly underestimated the number of unique combat lines in this game. There's over 80,000 unique combat lines alone, if you're curious. I also found out the game can time out with a Script Hang error lol.

So my idea of letting every monster have access to the ENG_Splice.rb file will sadly not work. I'll instead have to generate a unique ENG_Splice.rb for each monster (e.g. ENG_Splice_05_LesserSuccubus_00.rb)

Fortunately I wrote a Python script that checks all Mod and Base game Talk scripts for unique Talk lines and generates a formatted text file for easy copy-and-pasting to the ENG_Splice.rb file, so it's just a matter of breaking that down into each individual folder instead of one big chunk. The script also has (or, rather, will have) the ability to check for any new dialogue that's added to the game, including for existing monsters. I'll finish that up tomorrow then post the scripts / .rb files here.
 
Last edited:

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
Whelp, this is gonna be long. I wrote this little by little on the fly, so I might've missed important points, or gone jabbering about irrelevant drivel.
...Oh well, it's too late to start thinking about saving face; let's just post this as it is xD
The proof-of-concept actually shows English text being injected
Oh, you mean something similar to T++ or Xunity? A list of "jp1"->"en1", "jp2"->"en2"... and a string-by-string sub?
"え!? 外人を見つけました!"->"Eh? I thought I saw a pussycat!"
Then you'd look for every "え!? 外人を見つけました!" to replace it?
It's possible, I do that in the battlelog (look for "ʕ•ᴥ•ʔ ??"). I considered this before, but there are issues:
- the variables (#{targetname} and such). If the string has variables, then the sub has to take place before they're replaced, or we need a regex. And RPGM's Ruby is terribly inefficient with regexes.
- the backslash \ in Ruby strings. Very fun (not) when combined with sub(). Expect some hair loss over the silliest cases.
- Window_BattleLog's refresh itself needs be refactored at some point(to accomodate the missing letters)

That said, I have only the most complicated examples in mind; also, I haven't looked too much into the talk folder, or its related scripts. They got heavily refactored long ago - for good reasons and great results - but for me it was just a massive pile of dreadful TL-only work. So you might know the code better than me here.
So, Mod_talk folder. 5289 files in 274 folders... Duplicates, an issue, you say? Naaw, you must be lazy. :p
Looking at random lines...
" 「#{kiss_l}\n #{giggle} いい子ね……\n そのまま大人しくしててちょうだい……\\H」" super easy : "いい子ね……\n そのまま大人しくしててちょうだい……"
...Actually they're all easy to sub, no regex needed. And more importantly, the ms. functions are called before the other subs take place (#{giggle}, etc.)
Oh boy, there's not even any \y, \m or \w!? That's great news for you, だってばよ! (spoiler: you don't actually want to know)

So yes, you're perfectly right, that's the correct way to go for the talk folder.
Skilltext, however, is another story.
"Thing's an huge Lovecratian nightmare" - to quote... a friend.
- there are very few duplicates. Almost every line is unique.
- context matters a LOT. You might not want to translate the same small-medium chunk of text the same way - or in the same order.
- Flow is also much harder, since concurrent actions might take place at the same time, and circumstances may vary slightly every line.

No script or sub will help you here; welcome to nightmare corpse-city of R'lyeh.
You don't have to worry about updates. Whatever they update in skilltext, will be much less work than (see below). Dat's my job.
In this one case I'll comb every non-string difference one by one, and append our old code the exact same way they did on the new one. Easy.
There's no shortcut here, naught but 6666 lines of despair awaiting to engulf thee.
These are the two extremes. But most other mod files I'm familiar with, would lean on the skilltext side. Notably, every different window use a different draw function, each one basically handmade... But let's not add to the bad news, I need to keep a few stock for later :sneaky: (if only they could run out...).


I'm aware 魔_Force English is getting as fat and ugly as my (esteemed) neighbor.
I'll keep in mind your advice and see if I can give it a shave (not to my neighbor), as I update it. But I doubt it; may~~be if I aliased the 'mother' bitmap class's draw_text(x, y, width, height, str[, align])... if this is possible at all. Sounds more trouble than it's worth. My code is unsightly, but very efficient; not to gloat, but we won't have any drop in performance, were I to make it 60k, or 600k lines. That's why I avoided regexes like plague, or going through lengthy lists, etc: when I refactored my patch from the ground up back then, I intended to leave some wriggle room for a Shub-Niggurath or three.

But there's no need to report outdated parts of my scripts; especially parts of scene_battle (make_skill_action_result is one). I know, and I'll comb every single line of my checklist, outdated or not. I also spotted missing menu translations; that's code I must hunt down and tame.
And, yes, I know my stuff is mostly outdated. I'm on it. I just realized I never updated my readme; shame on me. No one reads it anyway (like the b) part) but that's no excuse.
I have 2-3 years of negligence to catch up with, and I will.
If you do manage to finish both the talk folder AND skilltext before I'm done updating, you're a goddamm monster! I ain't no lazy dawdler either. (there's also my poor excuse for a database translation to revise; as an extra margin :p).

Oh right: try not to add new lines whenever you can help it (skilltext in mind); it's much easier to compare files with the same lines disposition.
If anything gets in your way code-wise, do tell. Or destroy it yourself, I'll build it anew. As for your skilltext question, I'm not sure how it'll help you, but you'd look for where RPG::Skill::message is called (so 2 in Game_Battler Textmake, base code), then keep going upstream. Skill will ultimately refer to the loaded $data_skills; and actors to the ephemeral, elusive Battler class - the profane chimaera of other classes (the class class, enemies, skills, etc.).

Don't worry about future updates either; there's no way to reduce the to-be workload, other than:
- organizing duplicates like you intend to do
- on my side, keeping a strict checklist of the functions to check. It'll be a lot faster once my files are really up-to-date.
Updated .rxdatas will still be a major PitA no matter how I look at it; I currently have no solid idea about how to deal with them.

PS: Armors should be 100% up to date, they were easy. Abilities, pure nightmare material: the usual; but they're almost done, up-to-date and heavily revised.
Skills... Later. Many won't show in-game, that's usually element_set#14 (cf build_skills in English_system.rb) but not always so (some PC skills, beg-able skills, notably); some don't need be translated, some just the name.
But let me know if/how you need it (the skills list) if you intend to jump straight away into the skilltext bunny fields (Black Souls/Caerbannog species).
Otherwise I'll fully focus on updating ye olde code (in 魔_*.rb) like you've been nagging me to ;)

Bwa ah ah! :ROFLMAO:
And here I thought I was the only one using Python for menial tasks. I love my PyScripter, especially for MV' s jsons. It never chokes and dies no matter how many thousand lines I cram in it! Great paired with notepad++ regexes.

80k? Less than I thought. Last time I checked (years ago like I mentioned) how adding more mods would go, I was the one who almost choked and died. The unique lines count was already over 50k. So I put a lid on lil' Pandora box and called it a day.
That was why I was gently? prodding you towards skilltext, which I thought was more manageable. And no less crucial to the game. Whatever you feel like doing, and however you do it, is perfectly fine.

So we're talking 265 ENG_Splice_*.rb? I'll have a quick look at your code, I liked your initial centralization idea/intent, if doable.
In case you're worried about performance, looking the linemass: don't be. We historically considered https://ulmf.org/threads/rj181931-s...-hiatus-up-for-adoption-2018.9111/post-898322 moving the files themselves into the scripts (to deal with ANOTHER issue, awful loading time, which the modders somewhat resolved). It could work out, esp. since we'd only need to look for 100% new/appended lines with each mod update. Save that python module somewhere!
edit: done with armors/abilites. Tackling the core code update from now on. Nope, no more verbal diarrhoea 😅
 
Last edited:
Joined
Sep 21, 2020
Messages
81
Reputation score
39
Whelp, this is gonna be long. I wrote this little by little on the fly, so I might've missed important points, or gone jabbering about irrelevant drivel.
...Oh well, it's too late to start thinking about saving face; let's just post this as it is xD

Oh, you mean something similar to T++ or Xunity? A list of "jp1"->"en1", "jp2"->"en2"... and a string-by-string sub?
"え!? 外人を見つけました!"->"Eh? I thought I saw a pussycat!"
Then you'd look for every "え!? 外人を見つけました!" to replace it?
It's possible, I do that in the battlelog (look for "ʕ•ᴥ•ʔ ??"). I considered this before, but there are issues:
- the variables (#{targetname} and such). If the string has variables, then the sub has to take place before they're replaced, or we need a regex. And RPGM's Ruby is terribly inefficient with regexes.
- the backslash \ in Ruby strings. Very fun (not) when combined with sub(). Expect some hair loss over the silliest cases.
- Window_BattleLog's refresh itself needs be refactored at some point(to accomodate the missing letters)

That said, I have only the most complicated examples in mind; also, I haven't looked too much into the talk folder, or its related scripts. They got heavily refactored long ago - for good reasons and great results - but for me it was just a massive pile of dreadful TL-only work. So you might know the code better than me here.
So, Mod_talk folder. 5289 files in 274 folders... Duplicates, an issue, you say? Naaw, you must be lazy. :p
Looking at random lines...
" 「#{kiss_l}\n #{giggle} いい子ね……\n そのまま大人しくしててちょうだい……\\H」" super easy : "いい子ね……\n そのまま大人しくしててちょうだい……"
...Actually they're all easy to sub, no regex needed. And more importantly, the ms. functions are called before the other subs take place (#{giggle}, etc.)
Oh boy, there's not even any \y, \m or \w!? That's great news for you, だってばよ! (spoiler: you don't actually want to know)

So yes, you're perfectly right, that's the correct way to go for the talk folder.
Skilltext, however, is another story.
"Thing's an huge Lovecratian nightmare" - to quote... a friend.
- there are very few duplicates. Almost every line is unique.
- context matters a LOT. You might not want to translate the same small-medium chunk of text the same way - or in the same order.
- Flow is also much harder, since concurrent actions might take place at the same time, and circumstances may vary slightly every line.

No script or sub will help you here; welcome to nightmare corpse-city of R'lyeh.
You don't have to worry about updates. Whatever they update in skilltext, will be much less work than (see below). Dat's my job.
In this one case I'll comb every non-string difference one by one, and append our old code the exact same way they did on the new one. Easy.
There's no shortcut here, naught but 6666 lines of despair awaiting to engulf thee.
These are the two extremes. But most other mod files I'm familiar with, would lean on the skilltext side. Notably, every different window use a different draw function, each one basically handmade... But let's not add to the bad news, I need to keep a few stock for later :sneaky: (if only they could run out...).


I'm aware 魔_Force English is getting as fat and ugly as my (esteemed) neighbor.
I'll keep in mind your advice and see if I can give it a shave (not to my neighbor), as I update it. But I doubt it; may~~be if I aliased the 'mother' bitmap class's draw_text(x, y, width, height, str[, align])... if this is possible at all. Sounds more trouble than it's worth. My code is unsightly, but very efficient; not to gloat, but we won't have any drop in performance, were I to make it 60k, or 600k lines. That's why I avoided regexes like plague, or going through lengthy lists, etc: when I refactored my patch from the ground up back then, I intended to leave some wriggle room for a Shub-Niggurath or three.

But there's no need to report outdated parts of my scripts; especially parts of scene_battle (make_skill_action_result is one). I know, and I'll comb every single line of my checklist, outdated or not. I also spotted missing menu translations; that's code I must hunt down and tame.
And, yes, I know my stuff is mostly outdated. I'm on it. I just realized I never updated my readme; shame on me. No one reads it anyway (like the b) part) but that's no excuse.
I have 2-3 years of negligence to catch up with, and I will.
If you do manage to finish both the talk folder AND skilltext before I'm done updating, you're a goddamm monster! I ain't no lazy dawdler either. (there's also my poor excuse for a database translation to revise; as an extra margin :p).

Oh right: try not to add new lines whenever you can help it (skilltext in mind); it's much easier to compare files with the same lines disposition.
If anything gets in your way code-wise, do tell. Or destroy it yourself, I'll build it anew. As for your skilltext question, I'm not sure how it'll help you, but you'd look for where RPG::Skill::message is called (so 2 in Game_Battler Textmake, base code), then keep going upstream. Skill will ultimately refer to the loaded $data_skills; and actors to the ephemeral, elusive Battler class - the profane chimaera of other classes (the class class, enemies, skills, etc.).

Don't worry about future updates either; there's no way to reduce the to-be workload, other than:
- organizing duplicates like you intend to do
- on my side, keeping a strict checklist of the functions to check. It'll be a lot faster once my files are really up-to-date.
Updated .rxdatas will still be a major PitA no matter how I look at it; I currently have no solid idea about how to deal with them.

PS: Armors should be 100% up to date, they were easy. Abilities, pure nightmare material: the usual; but they're almost done, up-to-date and heavily revised.
Skills... Later. Many won't show in-game, that's usually element_set#14 (cf build_skills in English_system.rb) but not always so (some PC skills, beg-able skills, notably); some don't need be translated, some just the name.
But let me know if/how you need it (the skills list) if you intend to jump straight away into the skilltext bunny fields (Black Souls/Caerbannog species).
Otherwise I'll fully focus on updating ye olde code (in 魔_*.rb) like you've been nagging me to ;)

Bwa ah ah! :ROFLMAO:
And here I thought I was the only one using Python for menial tasks. I love my PyScripter, especially for MV' s jsons. It never chokes and dies no matter how many thousand lines I cram in it! Great paired with notepad++ regexes.

80k? Less than I thought. Last time I checked (years ago like I mentioned) how adding more mods would go, I was the one who almost choked and died. The unique lines count was already over 50k. So I put a lid on lil' Pandora box and called it a day.
That was why I was gently? prodding you towards skilltext, which I thought was more manageable. And no less crucial to the game. Whatever you feel like doing, and however you do it, is perfectly fine.

So we're talking 265 ENG_Splice_*.rb? I'll have a quick look at your code, I liked your initial centralization idea/intent, if doable.
In case you're worried about performance, looking the linemass: don't be. We historically considered https://ulmf.org/threads/rj181931-s...-hiatus-up-for-adoption-2018.9111/post-898322 moving the files themselves into the scripts (to deal with ANOTHER issue, awful loading time, which the modders somewhat resolved). It could work out, esp. since we'd only need to look for 100% new/appended lines with each mod update. Save that python module somewhere!
edit: done with armors/abilites. Tackling the core code update from now on. Nope, no more verbal diarrhoea 😅
I'm on mobile so can't really respond well, so I'll just sort-of reply directly to the entire thing.

Right now I have a somewhat functioning concept where every enemy and its variations (i.e. 05_Succubus and 00_Succubus are the same thing) are compressed into a .CSV file.

Now, ideally, this is how it works.

1. Upon "Talk" skill, game opens the corresponding "Talk" file
2. The appropriate message is appended to tx["tx1"] or tx["tx2"](I forget the exact name, not at my computer).
3. That message is pushed through a method, again since I don't remember the exact name I'll just say it was "ms.push(tx)"

That's the general flow of a Talk file as far as we're concerned.

The way I've designed this changes the flow a bit.

1. The game opens the corresponding file
2. A new global variable with the monster name is created (e.g. LesserSuccubus if we're in 00_LesserSuccubus)
3. The message is still appended to tx["tx1"] or tx["tx2"]
4. ms.push(tx) is changed to ms.push(ENG_Splice.injection(tx, monstername))
5. ENG_Splice.injection() retrieves the corresponding .CSV from ./ENG_Scripts/ (This is created separately by the python script--e.g. LesserSuccubus.csv)
6. The .CSV is loaded into a hash: STR_DB.
7. ENG_Splice.injection() then runs STR_DB.has_key(tx) to check if the Japanese line exists
8. If it exists, then ENG_Splice.injection() returns the value of that K,V pair--in other words, the English text. Otherwise it just returns tx to avoid errors.

I've run into a few problems that I plan to look at when I get home.

1. There's something causing the python script to not properly generate entire CSV files. I haven't dug too deep into this yet since I recently switched from JSON after that started giving me significant headaches.

2. The modders are shit at naming folders and it's screwing up how I parse the names. I have it down in Python for the most part, but extracting the folder name without variations in Ruby has been a PITA. And I still haven't gotten a good handle on this. I might have some ideas but I'll need to go back and rewrite some of the python as well I think.

3. RPG Maker XP uses a version of Ruby that's older than a large chunk of the people on this forum. It's fucking archaic. I'm still not sure how to exactly parse this .CSV into the hash because "require 'csv'" didn't exist in 2003. It seems to use Ruby version 1.8.1 which lacks nearly 20 years of features. (It actually uses a stripped down version of THAT version but don't even get me started on that...)

Anyway, those are the three main problems I have left to tackle. The actual formatting in the CSV is gorgeous and so easy to read / translate. Japanese in the first column, a spot for translation in the right column, and that's it. No more sifting through code.

Hopefully I can figure some of these problems out. I have some decent ideas, like stripping "_" characters from filenames rather than trying to keep them in (looking at you Greater_Demon).

Any suggestions are welcome
 

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
5. ENG_Splice.injection() retrieves the corresponding .CSV from ./ENG_Scripts/ (This is created separately by the python script--e.g. LesserSuccubus.csv)
6. The .CSV is loaded into a hash: STR_DB.
7. ENG_Splice.injection() then runs STR_DB.has_key(tx) to check if the Japanese line exists
8. If it exists, then ENG_Splice.injection() returns the value of that K,V pair--in other words, the English text. Otherwise it just returns tx to avoid errors.
Well, our old lady likes her old-fashioned arrays.
Probably obvious, but how about converting your csv's, when they're done? (and editing the relevant script)
カ,Ka
タ,Ta
カ,Ka
ナ,Na
After messing with notepad++ / python we get:
Ruby:
TLtab = [["カ","Ka"],["タ","Ta"],["カ","Ka"],["ナ","Na"]]
# then we could, with i in 0..3
text.gsub!(TLtab[i][0], TLtab[i][1]) if text.include?(TLtab[i][0])
# so

for i in TLtab
  text.gsub!(i[0], i[1]) if text.include?(i[0])
end
# or something
Ruby keeps giving me surprises, no matter how simple and archaic I keep the code.
Ruby:
# syntax error:
@UK_plus_text += "\n or Angelic embrace[羽→体]Attack LvMAX" #羽抱擁[羽→体]ホールド Attack LvMAX
# fixed:
@UK_plus_text += "\n or Angelic embrace[羽→体]Attack LvMAX" #羽抱擁[羽→体]ホールド Attack LvMAX
# hint: whitespace. I had 4 of these with the abilities. Notepad can't see them...
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
Well, our old lady likes her old-fashioned arrays.
Probably obvious, but how about converting your csv's, when they're done? (and editing the relevant script)
カ,Ka
タ,Ta
カ,Ka
ナ,Na
After messing with notepad++ / python we get:
Ruby:
TLtab = [["カ","Ka"],["タ","Ta"],["カ","Ka"],["ナ","Na"]]
# then we could, with i in 0..3
text.gsub!(TLtab[i][0], TLtab[i][1]) if text.include?(TLtab[i][0])
# so

for i in TLtab
  text.gsub!(i[0], i[1]) if text.include?(i[0])
end
# or something
Ruby keeps giving me surprises, no matter how simple and archaic I keep the code.
Ruby:
# syntax error:
@UK_plus_text += "\n or Angelic embrace[羽→体]Attack LvMAX" #羽抱擁[羽→体]ホールド Attack LvMAX
# fixed:
@UK_plus_text += "\n or Angelic embrace[羽→体]Attack LvMAX" #羽抱擁[羽→体]ホールド Attack LvMAX
# hint: whitespace. I had 4 or these with the abilities, and notepad can't see them..
That's actually what I'm working on now, funnily. I forewent the .CSV reading and have instead added an option to the Python to convert the .CSVs to .txt files when finished. I then plan to (haphazardly) run eval on the resulting formatted hash. Frankly it's the only thing I can think of that would work at this point.

However, of course, the File IO system is equally as archaic, so I'm currently working out how to even read these files into Ruby since ye olde File.read appears to throw a syntax error when used on something as basic as "File.read(file_path)" despite "if File.exists?(file_path)" returning true... 🙃
 

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
something as basic as "File.read(file_path)" despite "if File.exists?(file_path)" returning true... 🙃
You don't say... That's not the last bit of fun you'll have 😅
I won't do it this pass, but I'm gathering strings with a sub funtion in mind as well. (the ones that show when prompted $game_temp.script_message = true)
魔_Force English.rb would indeed, shrink dramatically if I get around to doing that. :unsure:
(edit: I mean, the whole point of everything I've done was to make the TL's job easier after all...)
 
Last edited:
Joined
Sep 21, 2020
Messages
81
Reputation score
39
You don't say... That's not the last bit of fun you'll have 😅
I won't do it this pass, but I'm gathering strings with a sub funtion in mind as well. (the ones that show when prompted $game_temp.script_message = true)
魔_Force English.rb would indeed, shrink dramatically if I get around to doing that. :unsure:
(edit: I mean, the whole point of everything I've done was to make the TL's job easier after all...)
Success!
OF1ANhr[1].png
v0pW3Yo[1].png

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):
zJ5lCPt[1].png
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?\""}
 
Last edited:

Strange

Demon Girl Pro
Joined
Jul 24, 2014
Messages
1,256
Reputation score
486
Success!
That's a huge fucking weight lifted.
Damn, that's smart. :D I should remember that defined?() exists, while I'm at it.

The only issue I could think of, is how damn inefficient RPGM is at looking up external ressources. We're looking at... 266 .txt files?
But no matter, cheers! 🥳
 
Joined
Sep 21, 2020
Messages
81
Reputation score
39
Damn, that's smart. :D I should remember that defined?() exists, while I'm at it.

The only issue I could think of, is how damn inefficient RPGM is at looking up external ressources. We're looking at... 266 .txt files?
But no matter, cheers! 🥳
The way the module works actually eliminates that issue altogether (or will, once I fix the pathing issue I mentioned). ms.push passes its own monster name to the ENG_Splice.injection() method. Think of it like this: ms.push(ENG_Splice.injection(tx, "LesserSuccubus"))

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. The only thing that will vary is the actual speed of reading the file itself. From what I've read, Ruby uses very low-level code for its I/O system which will basically make it reliant on how fast a person can read a text file on their computer in general.

I'm still debating on whether to update this even further to read line-by-line and therefore prevent loading the entire file into memory at once, or just keeping it on one line and leaving it as is. I'll need to see a real application of this to decide whether its worth investing more time into that, but as it stands it'll be fine as is. There's no noticeable delay right now at all and there shouldn't be since were looking at approx. 1 MB files?

On that note, it should be substantially less than 266 .txt files. It'll probably be closer to 150 or so, maybe less. I need to work on the python more before I get an exact number for that though.
 
Top