D

Deleted member 436513

Guest
Guest
Guys the "coder" created the project in the first place and he's also the primary writer, or at least contributes a similar amount as the artist. As mention previously, the artist goes by . MITY could even be the name the coder went by. You can't expect the artist to "fire" him (they're not even running a business, Patreon is a donation service) and just because he goes by "coder" doesn't mean it's necessarily the code he's struggling with.

[...]
Since this warrants a longer response, I'll be breaking it up into segments and responding to each. Note that my goal with these posts genuinely isn't to shit on MITY, they are far from the worst dev when it comes to goodwill, transparency or trying their hardest (especially the artist). I'm trying to be as neutral and fair as possible.

My main contention with "the coder" being the primary writer/programmer is that he's supposed to be THE ONLY writer/programmer. The artist coming in and writing or coding as much as 30-40% of the game speaks against him when compared with the artist. When you have Guy A who's drawing all the art, and doing potentially as much as half of the coder's programming and writing work, Guy B claiming to be burnt out raises a few eyebrows. Of course it's entirely possible that he's a different type of person who gets burnt out more quickly, but if I was in his situation, personally, I wouldn't feel like I "deserve" to complain or take time off when the other guy is essentially doing half of my work already in addition to his own.

I don't disagree with the notion of a writer's block, but... come on. I mean we're not exactly talking about Tolstoy here.

He was physically injured, he's having to care for his sick mother, probably felt guilty about breaking the monthly schedule a number of times and wasting time on a minigame, now likely worrying about his future financial situation.
Given that the art portion of the game was finished on August 24th at the latest and 0.8.3c came out Aug 14th, that leaves us with a timespan of roughly 4 months (119 days) to account for. Consult the timeline of events posted earlier for a more detailed breakdown, but suffice to say that the physical injury accounts for a two week period around the middle of November through December 5th (during which he also worked), caring for his sick mother is something that was mentioned in the past and is likely no longer applicable (he doesn't live with his parents, and staying with them seemed to be an unusual one time event), he has no reason to worry about his finances unless he owes money to a fucking Saudi oil magnate, and the artist told him to drop the CCG minigame and avoid getting burnt out way back in August before this entire thing began. Make of that what you will.

  • "Number of files" is a totally meaningless metric for code size or complexity. They could put the entire game (372,111 lines) in one file if they wanted, or have 372,111 files consisting of one line.
Hence why I included the filesizes in the screenshot (to give a rough estimate of how much code is involved - we're not talking about 3MB 78,000 LOC files. In this case it's 30k lines for Book 4, of which ~15k is boilerplate, ~15k is dialogue and ~2k is actual logic), selected the only two files with minigame code (i.e., programming), trimmed out the VN segments from even those, and brought up the example of the map screen and the day/night system as the most complex elements implemented in Ren'Py script as opposed to pure Python.

The intent was basically "if he hasn't even bothered to split it beyond two files, how much code do you think that is", and to show the ratio of what people understand as "programming" to everything else. But for the sake of transparency, this is what the entirety of Book 4 looks like (or it would, if it was organized):

overview0.png

_boilerplate is code that's self-explanatory (b4_eq1 is an equalist, their color is black, their side image is /equalist/sidebox/equalist_1.png, etc), _images are the sprite assignments ("bfau" is the Korra blowjob scene, it has 10 stages, stage 1 is /boobjob/body_1.png, stage 2 is /boobjob/ani_3.png, stage 3 is a 6 frame looping image with a 0.2 second delay between the frames etc), neither of them are terribly relevant, it's basically metadata that you wouldn't even use for future content.

Then we're left with code (which is the code for the minigames), and dialogue (which is the actual script and flow of the story).

You don't need to concern yourself with the minigame code, because you're not working on the minigames. The match-3 coin game is a fucking black box, you don't care what it does, and you don't care how it does it. Same with the blackjack minigame from Book 2. Yeah, it uses 18 files, all of them are identical, yeah 16 of those aren't even reached by the code, and yeah, all of them have a 52 element long if/else chain with variable names like "P6s" or "krix0". None of that is relevant. It does what it's supposed to, and it increments your money once it's finished. That's ALL YOU NEED TO KNOW. You don't need to touch it, you don't need to debug it, you let it sit there alone in the corner like the unloved abomination it is, and forget about its existence like its creator has.

Which then brings us to the only thing that involves logic you need to understand, the dialogue trees. Which make up ~16,000 lines of text, of which maybe 1000-2000 involve any kind of logic at all. Everything else is literally a book.

  • The code definitely does not exist in just those two files. Sure, they might have a higher proportion of code to text compared to others, but all of the 41 .rpy files that make up book 4 (spanning 28,862 lines) contain logic or data, and possibly dialogue. A lot of it could be considered "boilerplate" (compositing images for example) but all of it had to be written.
The reason I ignored those and why I'm overly dismissive of the VN side of things, is that I don't CONSIDER Ren'Py code to be fundamentally the same as programming. Note that I'm not saying "it takes no effort" either - writing DOES take effort. It just doesn't take the same kind of effort as programming in the conventional sense does. There are no classes you have to instantiate, you don't have to write unit tests, you don't need to know how A* search works, you don't have to be cautious when implementing cryptography, you don't have to write your own parser, you don't need to understand how binary formats work, you don't need to access a database, you don't have to work with matrices, you don't need to deal with the obscure bugs and API of the system you're running on, you don't have to worry about GC pauses, you don't need to worry about memory allocation, and I could keep going on and on. Ren'Py is control flow. That is ALL IT IS.

This...
Python:
    if spinner_level >=10:
        $ korra_foot_quest = 2
        jump air_train3
    else:
        tn "(i need to level up to {b}10{/b} on the spinners before i can train more with korra.)"
        jump bk4_training_menu
...is ALL you have to learn. That is the extent of the logic Ren'Py uses. Control flow.

It's a fundamentally different task that's much closer to writing and directing, and thus needs a different skillset. Same with the boilerplate code I mentioned like filename and image assignments, which make up almost as much of "the code" character-wise as the dialogue, follow a distinct formula, and could be easily offloaded to someone else with zero knowledge of the code or the script. Find the right filename, make sure it's on the right coordinates, make sure you put enough of a delay between frames that it looks the right speed, etc. They're glorified metadata files. It's busywork that you only even have to do in the first place because Ren'Py doesn't have a proper IDE or editor built around it which would handle it for you. It's the equivalent of manually renaming a hunded files in a directory. It doesn't take creativity or skill, it's not difficult, it just takes time. Christ, you could probably spend a few weeks putting together a basic graphical editor/preview tool for scenes or a PSD converter and save yourself months of effort down the line.

  • The images shown are far from an accurate depiction of the extent of the complexity of the code. Renpy is a thin layer over pygame. It grants you a DSL that funnels you into a control flow nightmare. jump (goto) and global variables everywhere. Works alright for a classic VN with essentially no gameplay, but the moment you need a minigame, inventory, complex series of interacting choices... There's a reason practically every RenPy game update ships riddled with bugs (Summertime Saga had to progressively rewrite their codebase to use finite state machines).
Yeah, and that's contention number #2. Even without the minigames and the Python side of things, EVEN amongst other VNs, Four Elements Trainer is very simple. The game doesn't HAVE an inventory system (ironically, because it might actually make things simpler). There are no complex series of interwoven choices which determine one of 17 possible outcomes with each character. The minigames don't affect your game state besides incrementing your money value or setting a flag to True. What you have are inline if/else choices with the dialogue listed right below, and scenes where the game outright fucking ASKS YOU which ending you'd like. Even as far as VN logic goes, FET's is firmly on the lower end of complexity.

Anyways, the reason I look down on VN code is because control flow isn't something you SHOULD have an issue with in the first place. It's something that's very easily visualized, and something that comes naturally to writing the story in the first place. If it becomes a problem because you didn't name your shit properly or you're deep within a nested loop of 19 elements, it's entirely a problem of your own creation. To illustrate what I mean, let's take a look at the two main components of Ren'Py code (ignoring boilerplate) - variables and control flow.

Suppose that you want to implement the Ember Island segment from Book 2 into the game.

You don't just start writing code from the get go, you do a million other things first. You decide on the idea, you talk it over with your partner, you think about what could be included, what the overall storyline would be, where it takes place in the game, and so on. You determine the scope of this update (an island in the love route, you interact with various girls, there's a crab minigame, the story involves azula warming up to you, we'll have these 13 scenes, the locations will be the beach, the house and the party you go to, the length is planned to be around five in-game days, etc).

In our mental map of the game's code, it's going to go right...

overview1.png

...there. So logically, it's only able to draw from or have an impact on variables here:

overview2.png

The only things that will be relevant to our Ember Island update are what has happened in the love route of book 2 so far, and what will happen in the love route of book 2 afterwards (which we're most likely not concerning ourselves with anyways, since we haven't even decided how the book is going to end yet). And if you were to finish the Ember Island update on your own as hired help for the project, the coder managing things would have to add a grand total of one (1) line of code to integrate it into the game: jump ember_island_start right at the end of that red section. You don't need to understand anything, and neither does the existing coder. Everything is modular and self-contained.

But why don't we make things more interesting? You start writing the story, and you reach a point as a writer where you decide that it would be a good idea to make a callback to a previous event. Let's say you're in a conversation with Azula and Mai, and there was a scene earlier in the Book 2 love route where you could choose to side with Azula or Mai respectively (which you know, because you've played the game already and/or wrote that scene yourself). You open the file that has a list of all of your variables for Book 2 (which you have, because you're not an idiot), you do a search for "azula" if you can't remember what it was called, find chosen_mai_over_azula, note that the comment above it says

Python:
#This variable is set to False if you told Azula about Mai in the shop during the second day of the love route, and True otherwise
and put that in your code. Then, for some reason you decide that one of the scenes in the Ember Island update will be influential on the story later, so you store the new variable island_azula_score, put it in your list, then add a comment above it which explains that

Python:
#This variable should be between 0-10 if you didn't get along with Azula, 10-20 if she was lukewarm towards you, and a perfect score of 23 is required for the special ending
followed by a breakdown of when it's possible to get points.

What you DON'T DO, is start fucking reading through the previous 293,400 lines of dialogue in the game and try to figure out where that variable was defined or when it gets modified, or HOPE that you can recall it every single time you need it. Because you're not fucking insane.



TL;DR - The problem is variables. The way you solve that problem is by having one of these:

variables.png

Let's take a look at problem number two. How do you comprehend this unwieldy chain of labels and quadruple-nested menu items and jumps and OH GOD

azu_throneroom_menu_1.png

Well first off, are you working on the Azula throneroom menu? No? Is the Azula throneroom menu going to be relevant in future content? What's that, "never again"? What the FUCK ARE YOU DOING here trying to read the code of the Azula throneroom menu, then? See the minigame rule above, close the file, forget about it, and go do something useful. Assuming the Azula throneroom menu actually IS relevant though, how would you go about comprehending this mess?

You don't. You separate the logic from the scenes, and read this instead:

azu_throneroom_menu_2.png

How do you memorize the complex relationship between jumps and how different labels link into each other?

You don't. You use one of these:

labels.png

Which you have, because you're not an idiot.




This became a rambly fucking mess and I'm too lazy to edit it down, sorry. The point is that if you were to be hired on right now to work on future content for the game, then
  • you ignore minigames and everything before the current book
  • you don't parse fifty million lines of code, you look at a tree of intro -> book4_map -> korra_room -> korra_training_menu -> korra_blowjob, and a list of variables
  • when writing a scene, you just write that standalone scene as its own thing with zero logic, code or labels, when coding minigames, you code that minigame separately as its own standalone project - i.e., you could be hired on as a writer or a programmer with ZERO knowledge of the game and have the existing guy implement your work
  • the order of how things should progress and what scenes should lead to what is ALREADY DECIDED beforehand, during the planning phase of the project, by someone doing the work of a director, which a writer then works off of and a programmer ties together with logic
  • understanding a call stack is the most basic component of programming, and is not even comparable to working on actual code
 
Last edited by a moderator:

H*A

Newbie
May 24, 2018
25
26
216
  • when writing a scene, you just write that standalone scene as its own thing with zero logic, code or labels, when coding minigames, you code that minigame separately as its own standalone project - i.e., you could be hired onto the project as a writer or a programmer with ZERO knowledge of the game and have the existing guy implement your work
This would likely be the easiest to implement, and have the biggest benefit to output.

Obviously you have to check state to decide what path to lead a player down, but well-structured and mostly distinct systems make it drastically easier to both track and isolate shoddy work, as well as avoid tech. debt that results from throwing things in wherever you can cram 'em.

As an aside: do you mean call stack here? Honestly, languages like Python make a big effort to abstract from anything to do with the call stack. I guess it's sort of a synonym for control flow - which could definitely be approached much better in FET's code.
 
Last edited:
D

Deleted member 436513

Guest
Guest
This would likely be the easiest to implement, and have the biggest benefit to output.

Obviously you have to check state to decide what path to lead a player down, but well-structured and mostly distinct systems make it drastically easier to both track and isolate shoddy work, as well as avoid tech. debt that results from throwing things in wherever you can cram 'em.

As an aside: do you mean call stack here? Honestly, languages like Python make a big effort to abstract from anything to do with the call stack. I guess it's sort of a synonym for control flow - which could definitely be approached much better in FET's code.
Wasn't sure what term to use, it's probably just control flow. Most of what you have in Ren'Py are labels (which are analogous to game "levels" or Unity scenes) that are on the same conceptual level of depth, nested if/else chains and menus which require you to keep track of how "deep" you currently are, and screens which are mostly used for UI overlays and minigames. Labels are pretty straightforward and naturally lend themselves to a linear A -> B graph/tree/whatever structure you can keep track of, similarly to how you'd have chapters one after the other in a book and a table of contents which you can use as an overview.

The "control flow" aspects of Ren'Py only become a problem if you start mixing the logic and the dialogue, leading you to doing stupid shit like copying and pasting the same ~1700 line long scene into three different locations which you have to maintain separately, or putting them inline (in-block?) with nested layers of logic, i.e.:

Python:
label falley_night2:
    if earth_deal:
        if tax_collector:
            if not tax_done:
                menu:
                    "kill him":
                        menu:
                            "donate the money":
                            "keep the money":
                    "knock him out":
                        menu:
                            "donate the money":
                                if variable >= 20:
                                    if flag == True:
                                        if condition:
                                        else:
                                            menu:
                                                "do it anyways":
                                                    if variable = 1:
                                                        "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
                                                        "Suspendisse porttitor arcu aliquet tortor vehicula, ut ultricies magna feugiat."
                                                        "Sed nec nunc non leo varius consequat eget sit amet orci."
                                                        "Curabitur malesuada nunc vitae tortor auctor facilisis."
                                                        $ variable += 2
                                                        "Praesent ut ligula sed augue scelerisque lobortis non dictum dui."
                                                        "Pellentesque nec tellus blandit, vestibulum lacus tincidunt, consectetur nibh."
                                                        "Donec sagittis nisl eu tellus aliquam, et accumsan ante maximus."
                                                        "Etiam aliquet turpis non ipsum consectetur, sit amet lacinia libero hendrerit."
                                                        "Pellentesque id diam at nulla ornare posuere."
                                                        "Sed accumsan tortor non eros pulvinar, sed varius magna eleifend."
                                                        "Donec non leo in elit rhoncus pellentesque."
                                                        "Phasellus in lacus posuere, dictum arcu vel, volutpat ipsum."
                                                        jump bk2_map
Or the fucking clown tier spaghetti code examples FET is known and loved for.

Untitled.png

Edit: Forgot to add that Ren'Py labels retain the current "state" when you swap them out (everything you've sent to the screen stays on the screen), so you COULD tehnically end up with something analogous to a call stack by doing the following:

Python:
label one:
    scene outside
    jump two

label two:
    show character with dissolve
    jump three

label three:
    play music "maintheme.ogg"
    jump four

label four:
    show othercharacter at left
    jump five

label five:
    c "Dialogue text"
    jump six
Which you wouldn't, because you're not what is known in the industry as "one hundred percent buttfuck insane". FET does suffer a bit from this (incidentally it's why it doesn't have a gallery/scene replay system either), but once again it's a problem you're creating for yourself and something that is still relatively easily fixable compared to debugging thousands of lines of actual logic.
 
Last edited by a moderator:

Qianke

Active Member
Apr 27, 2019
849
1,472
289
tbh this game isn't that far from completion, I mean, probly it's done in 70% at least so it'd be a shame to abandon it now,
 

Dr Krieger

Member
Jun 28, 2017
162
1,056
314
tbh this game isn't that far from completion, I mean, probly it's done in 70% at least so it'd be a shame to abandon it now,
I think they will update book 1 after finishing book 4

Also I don't understand the uproar about this 4 month break. This game delivered amazing updates with reasonable delays for a very very long time. They are nothing compared to ICSTOR or god save my soul Dual Family.
 

Balrog

Active Member
Jan 10, 2018
665
1,087
243
I think they will update book 1 after finishing book 4

Also I don't understand the uproar about this 4 month break. This game delivered amazing updates with reasonable delays for a very very long time. They are nothing compared to ICSTOR or god save my soul Dual Family.
The problem with a sudden unplanned 4 month break is that if you don't take care of the issue that caused it, it will become the rule rather than the exception.
 
  • Thinking Face
Reactions: CursedFlame91
D

Deleted member 436513

Guest
Guest
The problem with a sudden unplanned 4 month break is that if you don't take care of the issue that caused it, it will become the rule rather than the exception.
Thankfully, we're only a year or so away from the project's completion. Give me that Pema/Jinora scene so I can die happy, and the whole thing can burn for all I care.
 

Qianke

Active Member
Apr 27, 2019
849
1,472
289
Thankfully, we're only a year or so away from the project's completion. Give me that Pema/Jinora scene so I can die happy, and the whole thing can burn for all I care.
being here and waiting for that, I think you are already an addict though, you sure you won't ask for more once it happens? C:
 
Dec 9, 2019
73
122
43
Just gonna say it.

I love this VN trainer game. Love Route for the true, wholesomeness feeling which gives you a good feeling in your heart (and your pants)
The Slave route to be such a scumbag, and get away with it scottfree~

I eagerly look forward to Book 4's Love Route. I need my love wholesomeness with Korra and Asami… And possibly Impregnate them both. :D Yes, my favourite is the Pregnancy - The fact that I can influence and somewhat (redeem) Azula in Book 2 is incredible enough as it is.

I hope that once this Avatar Trainer is fully completed, we can see more work from the creator.

Star Wars will be nice~
 

Cybuster

Member
Sep 28, 2017
144
154
112
Wasn't sure what term to use, it's probably just control flow. Most of what you have in Ren'Py are labels (which are analogous to game "levels" or Unity scenes) that are on the same conceptual level of depth, nested if/else chains and menus which require you to keep track of how "deep" you currently are, and screens which are mostly used for UI overlays and minigames. Labels are pretty straightforward and naturally lend themselves to a linear A -> B graph/tree/whatever structure you can keep track of, similarly to how you'd have chapters one after the other in a book and a table of contents which you can use as an overview.

The "control flow" aspects of Ren'Py only become a problem if you start mixing the logic and the dialogue, leading you to doing stupid shit like copying and pasting the same ~1700 line long scene into three different locations which you have to maintain separately, or putting them inline (in-block?) with nested layers of logic, i.e.:

Python:
label falley_night2:
    if earth_deal:
        if tax_collector:
            if not tax_done:
                menu:
                    "kill him":
                        menu:
                            "donate the money":
                            "keep the money":
                    "knock him out":
                        menu:
                            "donate the money":
                                if variable >= 20:
                                    if flag == True:
                                        if condition:
                                        else:
                                            menu:
                                                "do it anyways":
                                                    if variable = 1:
                                                        "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
                                                        "Suspendisse porttitor arcu aliquet tortor vehicula, ut ultricies magna feugiat."
                                                        "Sed nec nunc non leo varius consequat eget sit amet orci."
                                                        "Curabitur malesuada nunc vitae tortor auctor facilisis."
                                                        $ variable += 2
                                                        "Praesent ut ligula sed augue scelerisque lobortis non dictum dui."
                                                        "Pellentesque nec tellus blandit, vestibulum lacus tincidunt, consectetur nibh."
                                                        "Donec sagittis nisl eu tellus aliquam, et accumsan ante maximus."
                                                        "Etiam aliquet turpis non ipsum consectetur, sit amet lacinia libero hendrerit."
                                                        "Pellentesque id diam at nulla ornare posuere."
                                                        "Sed accumsan tortor non eros pulvinar, sed varius magna eleifend."
                                                        "Donec non leo in elit rhoncus pellentesque."
                                                        "Phasellus in lacus posuere, dictum arcu vel, volutpat ipsum."
                                                        jump bk2_map
Or the fucking clown tier spaghetti code examples FET is known and loved for.

View attachment 483044

Edit: Forgot to add that Ren'Py labels retain the current "state" when you swap them out (everything you've sent to the screen stays on the screen), so you COULD tehnically end up with something analogous to a call stack by doing the following:

Python:
label one:
    scene outside
    jump two

label two:
    show character with dissolve
    jump three

label three:
    play music "maintheme.ogg"
    jump four

label four:
    show othercharacter at left
    jump five

label five:
    c "Dialogue text"
    jump six
Which you wouldn't, because you're not what is known in the industry as "one hundred percent buttfuck insane". FET does suffer a bit from this (incidentally it's why it doesn't have a gallery/scene replay system either), but once again it's a problem you're creating for yourself and something that is still relatively easily fixable compared to debugging thousands of lines of actual logic.
Wait... so there are switch case functions in Ren'py the coder is not using?


Anyway, no coder who is willing to work years for a game like this should ever use Ren'py as their platform. Unless this job is just a hobby. Seriously, use anything else. Build your own abstractions, use SFML or go straight for OpenGL GLUT. The whole idea of OOP is to make tedious work like a game loop more manageable and module, use it!
 
4.50 star(s) 305 Votes