07th-mod / tatarigoroshi

30 stars 11 forks source link

Let's fix conversation with Tomitake in tata_009.txt #34

Closed enumag closed 7 years ago

enumag commented 7 years ago

@ItaloKnox I kind of reported this previously with a promise of a better specification for you. Then I of course completely forgot about it. So finally here it is.

I added some comments into the script about what text should be cut out and the japanese text and voices it should be replaced with.

We could use the new GCensor flag from @P-Chang here to preserve both old and new text - the flag would be used to decide which branch to use. The question is whether we want to do it as it is more work - not much in this case but in other cases it could be far worse. I'm actually slightly leaning toward not doing this as we have enough of work already. I don't think anyone from the team asked for this flag to be implemented. Your opinion?

enumag commented 7 years ago

@P-Chang As the flag was your idea, can I ask for your opinion here? The idea behind it is good I think but the work it would require is not worth the effort in my opinion. Or did you just want to do the related work by yourself?

ItaloKnox commented 7 years ago

Perhaps I'm getting a little slow since it's pretty much dawn already, I should go to sleep. But let me ask a few questions about it, I think I didn't understand it that much or I'm forgetting something.

  1. What's the purpose of this?
  2. What exactly should I do? It seems that I should translate the text, shouldn't be a big issue but is there more than that to do?
  3. What exactly will we achieve with this?

Maybe this sounds a little odd or that I'm against it, but I think I just forgot what we were going to do.

Also don't you think we currently have a pretty good balance between censored and uncensored text? I'm afraid people will heavily dislike playing it censored so it feels kinda pointless to have both. There are definitely some stuff I want to fix, but they are in Onikakushi and Watanagashi, if I recall correctly. I don't remember anything like that in Tatari.

enumag commented 7 years ago

@ItaloKnox This is not about censorship. I don't want to censor the game any more than you do. Re-read this + few comments below: https://github.com/07th-mod/higurashi-patch-compiler/issues/2#issuecomment-318027395

It seems the GCensor flag is probably confusing you. I'm actually a bit confused by it as well so for the purpose of this minor issue let's pretend it does not exist.

ItaloKnox commented 7 years ago

Ohhh yeah, I remember it now. The GCensor flag confused me a bit.

Okay, I think I can do something about it. Not 100% sure yet because I don't think I'll be able to make a proper judgement right now, but I'll try later today.

One thing: I don't really understand the changes in the file. I can see that the new dialog follows the PS3 script structure but the remove parts don't make much sense to me. Would it be an issue if I just translate it and you insert them in the game?

enumag commented 7 years ago

@ItaloKnox Not at all, I can finish it if you give me the translation.

If you want to understand the GCensor flag better, let me explain what I was thinking about doing with it (which may not necessarily be what @P-Chang had in mind). First let's say it's called GTextMatching instead of GCensor as that seems like a better name. It could have values like this:

0 = 100% original content 1 = original content + PS3-exclusive scenes 2 = original content with non-censoring changes from PS3 3 = use PS3 updated content but don't remove content that was simply cut out on PS3 4 = 100% PS3 matching

Doing this however would be way too much work. So I think we should just pick one option from these five and stick with it. You agree with me so far, right?

We're obviously not doing option 0. Option 4 is out of the question because of censorship. Option 3 would include some PS3 censorship changes too so that's out as well. So it comes down to options 1 and 2. From these I would personally like to go with number 2. And this is what this Tomitake issue is about - option 1 would use what we have now, option 2 would use the text I want you to translate.

Here is the text that would be cut out and replaced by a more natural "we already know each other" conversation:

"Hey, excuse me. You're from Hinamizawa, right?"
"......Yes, why?"
I've... seen this person around a few times.
...Right, I remembered.
...His name, I think, was Tomitake, a freelance photographer who lived in Tokyo.
He would zealously visit Hinamizawa every season to take pictures... or so Mion and the others told me, I think.

"I'm Tomitake. A freelance photographer. I specialize in wild birds and landscapes. I'm still pretty unknown, though."
It seemed absurd for him to introduce himself when I was just showing him to the shrine, but he gave me his name, so I needed to give mine back.
"I'm Maebara. ...Pleased to meet you, I guess."
"Maebara-kun? Pleased to meet you!"
He seemed like a pretty silly man... but that felt kind of good considering I'd been suffocating with worry over Satoko all night.

Removing this is nothing that could be called "censorship", it's just a simple change in the text. We already know all the information from Onikakushi so there is no need to repeat them. And it's better to have voices.

P-Chang commented 7 years ago

Basically I can not do it quickly, but I will do something about Censorship by myself. Although I'll make tutorial after finished dlls.

Could you wait it ?

Console devs change Tomitake scene because console version have long prequel sequence in every chapter. Always he say same thing is really important things in entire chapter in my opinion.

enumag commented 7 years ago

Could you wait it ?

Sure. What's left to be done with the DLLs? Btw. I do have some more bugs I wanted to ask you about - maybe you would be able to fix them with some DLL change. Should I give you the specifics now or keep it until later?

P-Chang commented 7 years ago

I think leaving now is only fix "SettingLoad" commands. I know the this Engine have many bug, I can't think I can fix all but what do you want to fix?

I mean "finish" is just fix "SettingLoad" and it is not true finish. only finish for now.

I don't think we should port these scenes. Do you know much about system difference betteween PC and CS?

In PC version player only read. but In CS version, player sometimes need choice like every other NVL-Game. CS devs delete early sequence of chapter 1,2,3. and they combined these.

It is really boring with PC version system. and If we port these scene completely, we should combine chapter1,2,3

1 to 15 of this playlist is prequel sequence. https://www.youtube.com/watch?v=g6MPIArQ9Ic&list=PLff23ljXjapMt7reP0ak1vLFFM0Owi6j4

But some scene is really good, Keiichi and father and Rena have dinner in Maebara residence is my fav

enumag commented 7 years ago

Oh so there is a prequel part on the console that has some sort of choice at the end that splits the story to Oni, Wata and Tata? Interesting, But not for us.

I'll create a new issue for the bugs.

P-Chang commented 7 years ago

Yes, everyone think it is interesting at first. but player miss choosing, game bring big spoiler chapter to player...

ItaloKnox commented 7 years ago

Okay, so what are we going to do? I don't really think it's worth adding this prequel from the console version.

enumag commented 7 years ago

Of course not. But I think we should update this Tomitake scene regardless. I don't like voiceless scenes unless it's something that was censored out on PS.

ItaloKnox commented 7 years ago

Hmm, is that all? Honestly I expected a little more. 😆

S03/08/140800001 「こんにちは、圭一くん。
"Good evening, Keiichi-kun. 
S03/08/140800001_1 こんなとこで会うとはね」
Didn't think we would meet here."

S03/01/140100246 「……………富竹さん?」
"Tomitake-san?"
富竹さんは気さくな仕草で手を上げると、にっこりと笑いかけた。
Tomitake-san was good humored was usual, smiling all the way through.

S03/08/140800012 「いやぁ、今日もいい天気でよかったよ。
"Hm, I'm really glad the weather is looking so good today. 
S03/08/140800013 天気予報だと寒冷前線が近づいてるって言ってたけど、まだ大丈夫みたいだね」
The weather forecast said that a cold front is coming very soon, but it still looks fine here."

S03/01/140100251 「そうですね。
"Yeah. 
S03/01/140100252 でもまだ、梅雨明けはしてないみたいですよ」
But looks like the rainy season isn't over yet."
S03/08/140800014 「うーん、明日は遠出するつもりだったんだけど……。
"Yep, I was planning to go out tomorrow but...
S03/08/140800015 ちょっと、計画を立て直した方がいいかもしれないなぁ」
I guess it's not a bad idea to make some changes to my plan."

I took a few small liberties to adapt a few things, but the core idea is the same. As usual, you're free to give the finishing touches.

enumag commented 7 years ago

@ItaloKnox Yep, that's it. 😄 Thanks!

P-Chang commented 7 years ago

http://www.mediafire.com/file/2npef93q0y9f5d8/tata009test.rar

I made GCensor Flag sample for this scene. It work with my newest DLL that was updated few hours ago. http://www.mediafire.com/file/ab9qvao3o3jp1b5/chapter3dlls_v3.x.x.rar

I changed line 479,488,618. and move dialog to ztata_009_vml00_n01(Original) and ztata_009_vml01_n01(Console).

I made this for just my taste and opinion. but it have some good things.

First: If I or someone separate dialog first, translator can find dialog line easily. So, we don't need to change dialog, add voice, translate in same time.

In fact, this project are not friendly for translator. person that is good in code and language have not huge population.

Look "ztata_009_vml01_n01" in archive, it is still code, but translator find dialog line that need translation easier than current files.

If we separate like "ztata_009_vml01_n01" and , make "need translation list" page, probably @ItaloKnox don't need translate console dialogs all. and he can do this when he want.

I sometimes translate some English game and mods to my mother language, I know, it is confounded task that translator do his work when someone said "Hey. I need this line, please translate it quickly!"

Second; If someone find voice that nearly original, recovering is really simple.

Third; We don't need such a discussion that like https://github.com/07th-mod/meakashi/issues/9

Although, it took less time than I thought.

P-Chang commented 7 years ago

My old plan for GCensor flag.

0 = 100%-Original 1 = Added Scene(like Miyuki, and I know the scene of introduce Natsumi) 2 = Minor change of mob character dialog(Police, Politician, Villager), and Main character's nickname (like KeiKei and Keiichi-san, RenaRena and Rena-san(Satoko)), and tone change(like 傾注傾注 and 傾聴傾聴(Mion)). 3 = Sexual, Legal, Political, Coppyright issue and disable non-voiced dialog 4 = Violence.

There are not big difference with flag rules that @enumag wrote. But I think my old plan is pretty easy.

I don't think we should apply all dialogs, it is too hard. but if you change scene, I would like to use this.

My main purpose is recovering original dialog in capter1 and 2. Console dialog lines are really boring for me, and I already found many voice in chapter2.

But I think I must not delete dialog that already was translated. I want to never piss off the other guy's works.

OK, it's just my idea and @enumag would not like to touch this. I'll do all by myself.

P-Chang commented 7 years ago

http://www.mediafire.com/file/px63gi6dae3fy7o/tata009test02.rar And I made AltVoice sample for this scene. If GCensor is set to 0 and GAltVoice is set to 1, original line can play voice from another source.

I extract these from my collection, it is really lore. These have BGM and SFX. I remove these with audacity so, these are bit noisy. But it is not problem if player doesn't use louder headphone.

Tutorial:

Basically, I was going to suggest this after beta release of Dll Edition. But suddenly this issue is started, so i write it now.

Until somedays ago, I planed use only if branch like

if (GetGlobalFlag(GCensor) == 1)
{
dialog
} else {
dialog2
}

but script file already have ton of if branch.

So, I planed use callscript like


if (GetGlobalFlag(GCensor) == 1)
{
CallScript("file"); Break();
} else {
CallScript("file2");
}

but if I use this plan, Update folder will have ton of file,

So, I made new "ModCallScriptSeciton" command. It is able to call function except void main

Finally, It become

if (GetGlobalFlag(GCensor) == 1)
{
ModCallScript("file","function"); Break();
} else {
ModCallScript("file2","function"); Break();
}

Break(); is different with "break" that we always use. it just escape scope. There are vanilla bug that engine load else section after callscript , but I add Break(); it was fixed.

If you find dialog that need apply this, add comment like //Need_Voice_Matching I'll apply it later.

Basically I will do all by myself. but I write procedure just in case.

If there are deleted and changed dialog like

voice
dialog
voice
dialog
voice
dialog(non-changed)
draw
sound
voice
dialog
draw
voice
dialog

make new file and paste and separate function like

file1;
void main()
{
}

void dialog001()
{
voice
dialog
voice
dialog
}

[voice
dialog(non-changed)
draw
sound] delete in new file

void dialog002()
{
voice
dialog
}

[draw] delete

void dialog003()
{
voice
dialog
}

and make new file and apply changing

file2:
void main()
{
}

void dialog001()
{
voice
dialog(CS)
voice
dialog(CS)
}

void dialog001()
{
voice
dialog(CS)
}

void dialog003()
{
voice
dialog(CS)
}

and edit original file

//VoiceMathing
if (GetGlobalFlag(GCensor) == 1) {ModCallScriptSection("file1","dialog001"); Break();}
else {ModCallScriptSection("file2","dialog001"); Break();}
//VoiceMathicngEnd

dialog(non-changed)
draw
sound

//VoiceMathing
if (GetGlobalFlag(GCensor) == 1) {ModCallScriptSection("file1","dialog002"); Break();}
else {ModCallScriptSection("file2","dialog002"); Break();}
//VoiceMatchingEnd

draw

//VoiceMatching
if (GetGlobalFlag(GCensor) == 1) {ModCallScriptSection("file1","dialog003"); Break();}
else {ModCallScriptSection("file2","dialog003"); Break();}
//VoiceMathingEnd
enumag commented 7 years ago

@P-Chang

I made GCensor Flag sample for this scene. It work with my newest DLL that was updated few hours ago.

Looks good although I'm not sure about the file separation. This could result in a very high number of files though but since I'm always searchng all the files it's not a problem. The ModCallScriptSection branching is another good suggestion.

What do you prefer? Personally I don't mind either way. Or rather I think I can get used to either so it does not matter to me.

Since you're using this scene for experiments I think I'll leave fixing it to you and move forward. Let me know if I can help with anything.

@ItaloKnox Any preference about how the branching should be handled in the scripts? (See @P-Chang's last post for details.)

In fact, this project are not friendly for translator.

Indeed. And it got even worse with the ADV-mode implementation since that made all scripts a lot more complicated. But it has never been a problem since we don't have a translator. If we did we could set up some translation platform and write a script to parse all strings out of the gamefiles and second script to put the translations back in. I thought we would need this for the console arcs but sadly we only have @DoctorDiablo working on those and he has no problem working with the scripts.

P-Chang commented 7 years ago

@enumag Thank you for you agree with this.

The thing that I felt most was that the compiler can not handle many files. The test to compile 500 files was OK, so it did not have any problem.

There was a possibility that the increased file lowered search performance. so I added "z" to the beginning of file name to solve it.

What do you prefer? Personally I don't mind either way.

I prefer my old plan, because I can separate it Intuitively.

Since you're using this scene for experiments I think I'll leave fixing it to you and move forward. Let me know if I can help with anything.

If the flag rule will be decide, I'll change the "if branch" according to it and I'll PR, the matter on this scene is over.

But I need add name for some line. Could you give me file that have "name rule"?

I can add it with finding it in game files, but list is really helpful.

And I apply this to early episodes of watanagashi in my fork repository for testing. https://github.com/P-Chang/watanagashi/tree/dll-update https://github.com/P-Chang/watanagashi/commit/b252f8313a7e407d9e6bea2e02eaec0e5b0ec77f

Separating is not hard, but convert old deleted line to ADV-Mode is bit hard. Could you prepare vanilla files of chapter1-2 that is applied ADV-Mode Auotmation? (Automation is enough, I can fix minor issues)

Although In chapter 3-5, if you find line that need this, telling me is enough for now.

If we did we could set up some translation platform

Actually, original arcs don't have much line that is need translation, it is enough with separating.

The script for console arcs is very valuable, it makes it easier for translators who can not understand the code to participate, it will reduce the burden of @DoctorDiablo

enumag commented 7 years ago

@P-Chang Use the flag as you see fit. :-)

But I need add name for some line. Could you give me file that have "name rule"?

I don't understant what file you mean.

Names are a bit of a problem. They were added automatically based on the voices by my ADV-mode script. However we can't run that again because it would duplicate the names in places where they are already. I think I'll have to write a new sript for this...

Could you prepare vanilla files of chapter1-2 that is applied ADV-Mode Auotmation? (Automation is enough, I can fix minor issues)

Ok, I'll send you a zip of vanilla Watanagashi pushed through ADV-mode script. Not sure how useful it will be though. The script was not meant to run on vanilla files...

P-Chang commented 7 years ago

@enumag OK, I make list by myself.

I think you have list that like

 if (GetGlobalFlag(GADVMode)) { OutputLine("<color=#956f6e>圭一</color>", NULL, "<color=#956f6e>Keiichi</color>", NULL, Line_ContinueAfterTyping); }
 if (GetGlobalFlag(GADVMode)) { OutputLine("<color=#5ec69a>詩音</color>", NULL, "<color=#5ec69a>Shion</color>", NULL, Line_ContinueAfterTyping); }
 etc
 etc
 etc

for fix some line by your hands. it is not true?

I thought automation make blank name if branch and replace lines of

OutputLineAll(NULL, "\n\n", Line_ContinueAfterTyping);

it is wrong?

enumag commented 7 years ago

@P-Chang I understand what you mean now. I don't have such file at the moment - I have a database table with the names and colors. I should be able to use it to compile the file for you.

The names automation works a bit differently. It does not replace anything, rather it inserts the name whenever it finds a voice line unless... some magic conditions to prevent bugs, it's difficult to explain.

enumag commented 7 years ago

@P-Chang Here you go. Note that I do change colors every now and then (like when a new chapter comes out or when we add a new character like recently Myuki in Himatsubushi) or names (sometimes a translation is wrong). Basically ask me for an updated version whenever a new arc comes out. I can just re-run the script to generate a new list.

https://gist.github.com/enumag/bcac8b86a2ad99bfe9e50534e3e3e892

P-Chang commented 7 years ago

@enumag Thank you! :) It is really helpful!

enumag commented 7 years ago

@ItaloKnox @P-Chang Do you guys have vanilla scripts for Wata anywhere? They are not in our git history.

P-Chang commented 7 years ago

@enumag http://www.mediafire.com/file/e7qjclhwt2pk78f/Scripts.rar

here.

enumag commented 7 years ago

@P-Chang Here are the files my ADV updater generated.

https://www.dropbox.com/s/cenp3d2ruytcjzj/Update.zip?dl=0

Anything else I can help you with before I return to Tatarigoroshi proof-reading?

P-Chang commented 7 years ago

@enumag Thank you! It is that I really wanted. Probably, I need your help. but I don't know what I need now.

And could you tell me things that I need be careful in edit with automated script?

enumag commented 7 years ago

And could you tell me things that I need be careful in edit with automated script?

Depends on the changes you're doing.

Generally do everything you can to prevent syntax errors, those can cause really nasty bugs and can be very difficult to find. Meaning be very careful about edge-cases.

Most of the things in the scripts have a meaning. Don't change things you're not sure why they are there. Good example are spaces at the end of lines - at first glance it would seem they don't need to be there or that they should be at the beginning of the next line. However they have to be where they are because of NVL/ADV compatibility.

Can I ask what kind of changes you want to do automatically? I mean I do have a lot of scripts already so maybe I could do it for you.

P-Chang commented 7 years ago

@enumag Although it is the edit of the previous stage

I'm changing some Line_ContinueAfterTyping to Line_Continue and deleting SetValidityOfInput( FALSE ); and SetValidityOfInput( TRUE ); and adding WaitToFinishVoicePlaying(4); in dialogs that long voice like

    PlayVoice(4, "s19/02/500200123", 128);
    OutputLine(NULL, "そんな魅ぃちゃんも、",
           NULL, " Even that Mii-chan...", Line_ContinueAfterTyping);

    SetValidityOfInput( FALSE );
    Wait( 1000 );
    SetValidityOfInput( TRUE );

    OutputLine(NULL, "…本当はすっごく女の子らしいんだよ。」",
           NULL, " is actually really feminine.\"", GetGlobalFlag(GLinemodeSp));
    PlayVoice(4, "s19/02/500200123", 128);
    OutputLine(NULL, "そんな魅ぃちゃんも、",
           NULL, " Even that Mii-chan...", Line_Continue);

    Wait( 1000 );

    OutputLine(NULL, "…本当はすっごく女の子らしいんだよ。」",
           NULL, " is actually really feminine.\"", GetGlobalFlag(GLinemodeSp));
           WaitToFinishVoicePlaying(4);

There are many Line_ContinueAfterTyping and Regularity is unstable and it should not be applied to a monologue, and there are some Line_ContinueAfterTyping was set in end of dialog. so it is confusing.

You have script for it?

ItaloKnox commented 7 years ago

@enumag I don't have any specific preferences on how you guys should handle this. I'm fine with it as long as it doesn't break things, but it seems hardly the case here. Just do it in a way you think it's better, I'll tag along with the changes.

enumag commented 7 years ago

@P-Chang This looks like something I could get done easily enough. You'll have to explain your intentions better though. I don't understand it enough from what you just wrote.

I'm changing some Line_ContinueAfterTyping to Line_Continue

Why? Under what conditions it should be replaced?

deleting SetValidityOfInput

Let's comment it instead of deleting. Call me paranoid but I want to be able to revert it if needed. We can always delete it later.

adding WaitToFinishVoicePlaying(4);

What does this function do exactly? Why add it only after a "long voice"? How do you define "long voice" for this?

P-Chang commented 7 years ago

@enumag Sorry, long is not good word. voice that use 2 or 3 or 4 or 5.... dialog commands.

Voice can't avoid Line_ContinueAfterTyping in AutoMode. But Line_Continue can avoid.

In this case

    PlayVoice(4, "s19/02/500200123", 128);
    OutputLine(NULL, "そんな魅ぃちゃんも、",
           NULL, " Even that Mii-chan...", Line_ContinueAfterTyping);

    SetValidityOfInput( FALSE );
    Wait( 1000 );
    SetValidityOfInput( TRUE );

    OutputLine(NULL, "…本当はすっごく女の子らしいんだよ。」",
           NULL, " is actually really feminine.\"", GetGlobalFlag(GLinemodeSp));

Dialog line stop in "そんな魅ぃちゃんも、" and game draw dialog "…本当はすっごく女の子らしいんだよ。」" after voice was finished.(Voice is そんな魅ぃちゃんも、…本当はすっごく女の子らしいんだよ。)

Line_Normal, Line_WaitForInput, Line_ContinueAfterTyping can wait voice but if Line_Continue is set before these, three commands can't wait voice.

So, I set WaitToFinishVoicePlaying(4);

It is work same as Wait(1000);. Differences are argument is voice layer and it's wait reaming time of voice layer.

Indeed, comment is better I'll do like that.

enumag commented 7 years ago

Would replacing Line_ContinueAfterTyping with Line_Continue everywhere work or would it cause some other issues?

Is the WaitToFinishVoicePlaying really needed? I mean I would expect GetGlobalFlag(GLinemodeSp) to wait for the voice as it is either Line_Normal or Line_WaitForInput which both wait for voice... What did I miss?

P-Chang commented 7 years ago

In click mode WaitToFinishVoicePlaying is not needed. But In auto mode it is really needed. without it, Line_Normal and Line_WaitForInput skip voice.

Line_Continuecan't wait voice in any mode. and some end of dialog use Line_ContinueAfterTyping. it also cause nearly issue.

Perhaps, I should read code is related with "Wait" in dll before start this.

P-Chang commented 7 years ago

I think my comment is strange and it seems it have contradiction. I think I'm bit confusing. I rewrite previous comment after sleeping once.

enumag commented 7 years ago

Indeed now I'm really confused.

But In auto mode it is really needed. without it, voice skip Line_Normal and Line_WaitForInput.

And this lost me completely. How does PlayVoice work then? I thought the whole point of using PlayVoice instead of PlaySE was to wait for voice in auto-mode whenever Line_Normal or Line_WaitForInput was used.

P-Chang commented 7 years ago

I can answer it now. Line_Normal or Line_WaitForInput can wait voice. but Line_Continue cancel it.

It is probably same as sniper rifle quick shot in FPS and jump cancel in fighting game.

enumag commented 7 years ago

Let me see if I udnerstand it correctly. So... normally Line_Normal, Line_WaitForInput and Line_ContinueAfterTyping all wait for PlayVoice in auto-mode, right?

Since you sometimes needed a Line_* that does NOT wait you added Line_Continue, right? This new Line_Continue force-cancels the normal waiting behavior - but not only for the OutputLine where it is used but for the following calls as well? For how long? This sounds really hacky...

P-Chang commented 7 years ago

Yes.

And I re-reading code. playvoice commands add "voice wait" time, it is reason why Line_Normal, Line_WaitForInput and Line_ContinueAfterTyping wait for voice in automode.

But If I add Line_Continue in game script, this command disable "voice wait" that is added by playvoice commnad. so Line_Normal, Line_WaitForInput and Line_ContinueAfterTyping can't wait voice in this case.

enumag commented 7 years ago

@P-Chang I assume that after using Line_Continue to disable waiting it then goes back to normal later? When exactly? Is it reset to normal by WaitToFinishVoicePlaying or...?

Is it not possible to change Line_Continue to only affect the one OutputLine call where it is used? The fact that it has effect on the following OutputLine calls too bothers me.

P-Chang commented 7 years ago

@enumag Line_Continue disable "WaitForVoice" until line that have "Line_Normal, Line_WaitForInput and Line_ContinueAfterTyping"

Is it not possible to change Line_Continue

I have no idea for that. I can understand why Auto mode can wait voice, but I can't understand why it works.

enumag commented 7 years ago

Let's have an example:

        PlayVoice(4, "s19/02/500200123", 128);
    OutputLine(NULL, "", NULL, "Line 1", Line_Continue);
    Wait( 1000 );
    OutputLine(NULL, "", NULL, "Line 2", GetGlobalFlag(GLinemodeSp));
        PlayVoice(4, "s19/02/500200124", 128);
    OutputLine(NULL, "", NULL, "Line 3", GetGlobalFlag(GLinemodeSp));

If I understand this correctly, only Line 3 will wait for voice. Normally Line 2 should wait as well but the Line_Continue from Line 1 prevents this - right? (If this is incorrect then skip the rest of my comment.)

So you want to fix it with this:

        PlayVoice(4, "s19/02/500200123", 128);
    OutputLine(NULL, "", NULL, "Line 1", Line_Continue);
    Wait( 1000 );
    OutputLine(NULL, "", NULL, "Line 2", GetGlobalFlag(GLinemodeSp));
        WaitToFinishVoicePlaying(4);
        PlayVoice(4, "s19/02/500200124", 128);
    OutputLine(NULL, "", NULL, "Line 3", GetGlobalFlag(GLinemodeSp));

Basically forcing the voice wait manually by the WaitToFinishVoicePlaying call. Now effectively both Line 2 and Line 3 wait for voice, right?

I don't like that. Instead would this work?

        PlayVoice(4, "s19/02/500200123", 128);
    OutputLine(NULL, "", NULL, "Line 1", Line_Continue);
        OutputLineAll(NULL, "", Line_ContinueAfterTyping);
    Wait( 1000 );
    OutputLine(NULL, "", NULL, "Line 2", GetGlobalFlag(GLinemodeSp));
        PlayVoice(4, "s19/02/500200124", 128);
    OutputLine(NULL, "", NULL, "Line 3", GetGlobalFlag(GLinemodeSp));

If I understand the issue then OutputLineAll(NULL, "", Line_ContinueAfterTyping); should reset the side-effect of Line_Continue. So both Line 2 and Line 3 should wait for voice in this case. I like this better than WaitToFinishVoicePlaying because the side-effect of Line_Continue is fixed right away and it does not have to be fixed later on.

P-Chang commented 7 years ago

@enumag sample1 and 2 are correct. and I tested sample3 right now and it didn't work.

Because, "WaitForVoice" is added when game use playvoice command. It is not loop function, it just add wait time like Wait(1000)

If game use LineContinue, Update function(it is reloaded in every frame) delete wait time. So, next "Line*"command can't wait voice in Auto mode.

enumag commented 7 years ago

I looked to the code a bit and with what I saw + what you explained I think I now understand how the voice waiting works. It doesn't seem like we have a choice but to use the WaitToFinishVoicePlaying... :-(

I mean the only way would be to basically call WaitToFinishVoicePlaying automatically in the DLL every time OutputLine is used with something else then Line_Continue. But I'm not sure if this would work correctly in all cases. What do you think?

I'll try to write the script later this week and update all episodes over the weekend.

P-Chang commented 7 years ago

I can't think coding in dll is good way.

First: I didn't touch about TextController except Carret (triangle square marker) position. And there are no WaitToFinishVoicePlaying that can monitoring all voice layer once.

Second: Half of texts are non-voiced monologue. it means dll handle meaningless process, almost of time.

Third: Dialog line that needs this fix is not majority of dialog lines.

Fourth: Decompiler can't decompile and recompile some method correctly. I can't compile entire class or namespace with decompiler. (Compiling class generally break DLL, I always compile method.)

And I have not found exactly location for coding it.

enumag commented 7 years ago

Yep, pretty much what I expected you to say. I'll write the update script soon. Here is the TODO list I got at the moment (check if it's what you wanted):

If there is Line_ContinueAfterTyping after PlayVoice, do the following:

Anything else you would like me to change with that script?

P-Chang commented 7 years ago

Thanks.

Here is the TODO list I got at the moment (check if it's what you wanted)

These are correct.

Anything else you would like me to change with that script?

How do you think voice channels that we use? it has no problem but starting from 4 don't looks good now. And, Replacing PlaySE to PlayVoice for placeholder. Although playvoice that use some layer is leaving before name, it should be in after name.

enumag commented 7 years ago

How do you think voice channels that we use? it has no problem but starting from 4 don't looks good now.

You mean you want me to decrease all PlayVoice channels by 3 (from 4 to 1, from 5 to 2 and so on)? Well it's certainly doable but I don't see any benefit. Is there some limit to how many channels we can use? Are you sure the channels are not shared between BGM/SE/Voice?

Replacing PlaySE to PlayVoice for placeholder. Although playvoice that use some layer is leaving before name, it should be in after name.

My apology but I have no idea what you mean by this. Can you rephrase? Maybe give me some example?

P-Chang commented 7 years ago

@enumag Oh, Probably I could write code for fix work without WaitToFinishVoicePlaying. and it will not run WaitToFinishVoicePlaying in DLL everytime except using Line_Continue. I rewrite it and upload today or tomorrow. Could you test it? And If you sure, which chapter is good in testing?

You mean you want me to decrease all PlayVoice channels

Probably, there are limit, but I don't know exactly number and it is low or high. BGM SE Voice are not share channels

but you are right. it is not necessary now. forget it.

placeholder (tata_001.txt)

//「あ、どもー@ お疲れ様です。@
//「かー、ひでー臭いだなぁ@ おい@ ブルーシ、上までちゃんと囲っとけよ@ 民家の二階から丸見えだぞ!¥
    if (GetGlobalFlag(GADVMode)) { OutputLineAll("", NULL, Line_ContinueAfterTyping); }
    PlaySE(4, "", 128, 64);
    OutputLine(NULL, "「あ、どもー!",
           NULL, "\"Oh, hello!", Line_WaitForInput);
    OutputLine(NULL, " お疲れ様です。」",
           NULL, " Good work today.\"", GetGlobalFlag(GLinemodeSp));
    if (GetGlobalFlag(GADVMode)) { ClearMessage(); } else { OutputLineAll(NULL, "\n", Line_ContinueAfterTyping); }

it should be

//「あ、どもー@ お疲れ様です。@
//「かー、ひでー臭いだなぁ@ おい@ ブルーシ、上までちゃんと囲っとけよ@ 民家の二階から丸見えだぞ!¥
    if (GetGlobalFlag(GADVMode)) { OutputLineAll("", NULL, Line_ContinueAfterTyping); }
    PlayVoice(4, "", 128);
    OutputLine(NULL, "「あ、どもー!",
           NULL, "\"Oh, hello!", Line_WaitForInput);
    OutputLine(NULL, " お疲れ様です。」",
           NULL, " Good work today.\"", GetGlobalFlag(GLinemodeSp));
    if (GetGlobalFlag(GADVMode)) { ClearMessage(); } else { OutputLineAll(NULL, "\n", Line_ContinueAfterTyping); }

name things(omake_03.txt(tata))

//「「「わっはっはっはっはっは!!」」¥
    PlayVoice(2, "s20/02/440200237", 128);
    PlayVoice(3, "s20/03/440300363", 128);
    PlayVoice(4, "s20/04/440400213", 128);
    PlayVoice(5, "s20/05/440500130", 128);
    PlayVoice(6, "s20/08/440800128", 128);
    PlayVoice(7, "s20/09/440900125", 128);
    PlayVoice(8, "s20/06/440600132_01", 128);
    if (GetGlobalFlag(GADVMode)) { OutputLine("<color=#f5e6d3>全員</color>", NULL, "<color=#f5e6d3>Everyone</color>", NULL, Line_ContinueAfterTyping); }
    PlayVoice(9, "s20/11/440700400_01", 128);
    OutputLine(NULL, "「「「わっはっはっはっはっは!!」」」",
           NULL, "\"\"\"Wah-ha-ha-ha-ha-ha-ha!!\"\"\"", Line_Normal);
    ClearMessage();
    DisableWindow();
    DrawSceneWithMask( "bg_165", "right", 0, 0, 300 );
    PlayBGM( 1, "msys01", 128, 0 );
    DrawBustshotWithFiltering( 3, "re_se_wa_b1", "right", 1, 160, 0, FALSE, 0, 0, 0, 0, 0, 20, 300, TRUE );

it should be

//「「「わっはっはっはっはっは!!」」¥
    if (GetGlobalFlag(GADVMode)) { OutputLine("<color=#f5e6d3>全員</color>", NULL, "<color=#f5e6d3>Everyone</color>", NULL, Line_ContinueAfterTyping); }
    PlayVoice(9, "s20/11/440700400_01", 128);
    PlayVoice(2, "s20/02/440200237", 128);
    PlayVoice(3, "s20/03/440300363", 128);
    PlayVoice(4, "s20/04/440400213", 128);
    PlayVoice(5, "s20/05/440500130", 128);
    PlayVoice(6, "s20/08/440800128", 128);
    PlayVoice(7, "s20/09/440900125", 128);
    PlayVoice(8, "s20/06/440600132_01", 128);
    OutputLine(NULL, "「「「わっはっはっはっはっは!!」」」",
           NULL, "\"\"\"Wah-ha-ha-ha-ha-ha-ha!!\"\"\"", Line_Normal);
    ClearMessage();
    DisableWindow();
    DrawSceneWithMask( "bg_165", "right", 0, 0, 300 );
    PlayBGM( 1, "msys01", 128, 0 );
    DrawBustshotWithFiltering( 3, "re_se_wa_b1", "right", 1, 160, 0, FALSE, 0, 0, 0, 0, 0, 20, 300, TRUE );