Now you see three files on a blackboard. One file is a scenario. Other two define emotes.
◯Assets
Live2D models by saretra05
アトリエと電脳世界 from DOVA SYNDROME site (s-dova)
Mozart - K.525 (breakcore remix by onu)
◯Custom file formats
From Live2D exported files I inherited idea of double extension, so I have two files "teto.emotes.txt" and "rei.emotes.txt". Godot allows to edit txt files easily, and export_filepath annotation allows to define filter like "*.emote.txt", making linking files to object easy.
And yeah, I'm having too much fun coming up with own file formats and parsers for them.
For emotes, I was annoyed they take a lot of vertical space, so I came up with separation by "\", so one emote is one line.
Also I like map tables. It's super-convenient to replace parameter names in one place so data is kinda reusable.
◯Animations
As for now, I use teleports.
Or, dare I say, "e" stands for "immediate", and the fact that Live2D objects just decided to render transition smoothly is specific to them. I could something like drag&drop sprite-based stuff like Zundamon Theorem does, and same principles would work.
I mean, file is not concerned with defining animations,transitions, etc. Just what to write where.
Emotes in my implementation are universal - they can target any parameter of object. Godot has super convenient method "set" that allows to access parameter by string, and if parameter doesn't exist, nothing breaks.
I have "capture_mouth" variable. If true, it's animated by volume. If false, it targets whatever is set to targets.
When emote is processed, "mouth" is a special key in a sense that it disables mouth automation on top of setting target value. And just in case, playing speech sound automatically enables mouth capture. So it just works.
◯Interpolation
For mouth and eyes I came up with fairly standart approach where there is "current" and "target" value.
For blinking I added third value, which is "blink coeff". So, blink happens for any state of eyes without destroying it. It was easy find because Live2D models look more natural than pngs, and it makes no sense for human to not blink.
Also, tweens. They are overpowered. Just look up "create_tween" function and all stuff it allows to chain. I rewrote blinking to use tween, no need for whole AnimationPlayer node.
Tweens may not be applicable in any scenario, but for uninterrupted one-shots they are incredible.
Also, I made "moon smile" as a joke inspired by Gintama, but I think name fits and it's as fun as seeing Zundamon and Metan being both sassy about notation abuse.
◯Scenario
I made skibidi scenario just to mock up how file should look like, but after implementing format it was convenient to keep it. So, I elaborated on it.
I have opportunity to mention remix by onu. I want to hear happy extratone remix of classical music piece! Breakcore is not extratony enough! I love extratonic texture.
Also, I think I procrasinated rendering voicelines because Godot has no trivial way to play specific part from audiofile, and it could make parsing more annoying as there is either just path or time is appended. Though I could make special line , maybe "sc" that commands AudioPlayer to play from given position, run times with time difference of two values, then stop. Yeah, next video will be fully voiced.
◯About presentation
I wanted to implement presentation. It shouldn't be too hard, right?
Oh boi, refer to a ppt specification. It's basically the same what I did but more complex. Create\destory text, create\destroy images, tween text position, tween image position, advance current scene, destory current scene and generate next one. If I build own presentation format on top of current scenario file, that would mean having nested scenarios.
◯Misc
I do have a lot of fun stuff to think about, but rendering is a commitment. Voicelines take actual effort to make, even if with no tuning. There was video that used OpenUTAU to render Teto for primitive Speech-to-Text-to-Speech. But talkloids without pitch variation are lame.
Rei is so perfect, like, she's UTAU, english C+V voicebank can be found, saretra05 made good model for her. She's robot robot, because voice was synthesized from zero - she has no voice provider. So in discussion she could explore pov of machine.
And also this: • ユーロジー / 重音テト・足立レイ
If Kasane Teto is pick №1, then Adachi Rei is pick №2.
And yeah, I really should explore something fun later. I mean, I'm yet to come up with how to register blackboard and call advances on it. I guess I can add instruction "a" or "f", where "f" is "function call". And "a" I intend for looped\long\complex animations. And I may or may not come up with special file format to capture all cool stuff of procedural animations.
Very much unlike animations of AnimationPlayer, tweens are free to use any values. So animations could be randomized.
I also procrastinated on bg transitions and proper handling of bgm. No fades, no nothing.