CREATE YOUR AI CUM SLUT ON CANDY.AI TRY FOR FREE
x

jujuteux

Newbie
Oct 22, 2017
26
31
Before everyone here ratios you for this point in particular, I'll say that expecting people to go out of their way to fill in holes for a game that the developer created themselves, and that they continue to derive significant monetary value from in spite of leaving these gaps of content, even when not mentioning that at least on paper, said developer can just take their work wholesale without credit or recompense, is naive at best, especially since many of the things people here want to see (expanded story content, player housing, better combat/progression/economy systems, improved performance, etc.) would take a hell of a lot more effort than simply cooking up some XML files and sketching a few vector graphics.
alright then
First: if you doubt their work quantity, check their activity on github, not in pulls but in sheer amount of code, and at least double it for anything not XML
the amount of shit done is huge and everytime a mechanic is added it often becomes part of the shit to take into account when making anything new

second: what you described isn't what inno is doing and isn't what i'm doing or telling people to make.
I'm talking about PR'ing it to the github to have it as more than a mod.
i'm not talking about mere XML files, and even for those now you can already start to make significant content and quest stuff with the xml support code.
You can definitively PR XML stuff but nowhere is it written you can't PR java code

third: the performance issue i can't really say much but i've use jProfiler and it's really some html webengine stuff doing 60%+ of the time and it's a java thing, not the code.
 

Sarkath

Active Member
Sep 8, 2019
531
908
*cracks knuckles* I haven't done one of these kind of posts in a while.

alright then
First: if you doubt their work quantity, check their activity on github, not in pulls but in sheer amount of code, and at least double it for anything not XML
the amount of shit done is huge and everytime a mechanic is added it often becomes part of the shit to take into account when making anything new
Lines of code is a very poor metric for productivity. One can very easily commit thousands of lines with minor refactors alone, and those can be handled automatically by an IDE, or simply moving things around. I remember seeing the latter quite a bit when I was routinely sifting through LT's code, and it seems as though that's still happening once in a while.

Organization and refactoring are both fine, but it's also very good at inadvertently padding out commits, especially given that SCMs will flag lines as "changed" if you so much as change the amount or type of whitespace. There really isn't a good way to account for that.

Even if we're referring to new code, you need to actually look at the code and not just how much of it there is. A 50-line "Hello World" program in a given language is almost always objectively worse than a 1-liner. Plus, there are still plenty of things that are implemented in Java that really shouldn't be. Here's an example from a recent commit ( ):

Java:
public static AbstractStatusEffect SET_SUBMISSIVE_STEED = new AbstractStatusEffect(70,
            "Domesticated Beast",
            "clothingSets/submissive_steed",
            PresetColour.CLOTHING_STEEL,
            true,
            Util.newHashMapOfValues(
                    new Value<>(Attribute.MAJOR_PHYSIQUE, 5f),
                    new Value<>(Attribute.RESISTANCE_LUST, -5f)),
            null) {
        @Override
        public StatusEffectCategory getCategory() {
            return StatusEffectCategory.INVENTORY;
        }
        @Override
        public String getDescription(GameCharacter target) {
            if(target!=null) {
                return UtilText.parse(target, "By wearing a full set of tack, [npc.name] [npc.verb(find)] [npc.herself] feeling like a loyal, submissive beast, and [npc.verb(want)] to work hard for [npc.her] owner!");
            } else {
                return "";
            }
        }
        @Override
        public boolean isConditionsMet(GameCharacter target) {
            return SetBonus.getSetBonusFromId("innoxia_submissive_steed").isCharacterWearingCompleteSet(target);
        }
    };
26 lines of code to add a status effect, which should probably be in XML. Here's a huge wall of "code" from (not trying to single out DSG here; there's really doesn't seem to be any other way to define quests at the moment):

Java:
        //Eisek Quests

    EISEK_STALL_QUEST_STAGE_ONE(QuestType.SIDE,
            1,
            10) {
        @Override
        public String getName() {
            return "Gathering Materials";
        }
        @Override
        public String getDescription() {
            return "You've learned what Eisek needs to fix up his stall, as well as what he would like on a new sign. Now you just need to gather some materials from the merchants around town for a nice surprise. Maybe there's one that deals in fabric?";
        }
        @Override
        public String getCompletedDescription() {
            return "You've ordered a new sign and some bolts of cloth from Monica.";
        }
    },

    EISEK_STALL_QUEST_STAGE_TWO(QuestType.SIDE,
            1,
            10) {
        @Override
        public String getName() {
            return "Need an Awning Here";
        }
        @Override
        public String getDescription() {
            return "While you're waiting for Monica to finish your order, you need to find some wooden poles for the awning. Perhaps the local smithy could modify the haft of a polearm could be modified somehow?";
        }
        @Override
        public String getCompletedDescription() {
            return "You've placed an order with Imsu and Hale for some modified axe hafts.";
        }
    },

    EISEK_STALL_QUEST_STAGE_THREE(QuestType.SIDE,
            1,
            10) {
        @Override
        public String getName() {
            return "It's All Coming Together";
        }
        @Override
        public String getDescription() {
            return "You should check back in with Hale in a day and Monica in three days to see if your order is ready yet.";
        }
        @Override
        public String getCompletedDescription() {
            return "You've gathered all the materials.";
        }
    },

    EISEK_STALL_QUEST_STAGE_FOUR(QuestType.SIDE,
            1,
            10) {
        @Override
        public String getName() {
            return "Putting it all together";
        }
        @Override
        public String getDescription() {
            return "You have what you need to improve Eisek's stall. Tell him about it the next time you see him.";
        }
        @Override
        public String getCompletedDescription() {
            return "As far as you could tell, Eisek was overjoyed at what you've done for him and his stall looks better than ever.";
        }
    },

    EISEK_MOB_QUEST_STAGE_ONE(QuestType.SIDE,
            10,
            25) {
        @Override
        public String getName() {
            return "One against Many";
        }
        @Override
        public String getDescription() {
            return "Eisek explained why there was a mob hounding him, but he doesn't know much about them. If you want to make sure they don't come back, you'll have to find them and confront them."
                    + "<br/>As they seemed to be comprised of locals, maybe a search around town will do the trick.";
        }
        @Override
        public String getCompletedDescription() {
            return "Through a bit of luck and the mob putting up a big colourful poster, you've found and entered their meeting place.";
        }
    },

    EISEK_MOB_QUEST_STAGE_TWO(QuestType.SIDE,
            10,
            100) {
        @Override
        public String getName() {
            return "Leave the Dragon Alone!";
        }
        @Override
        public String getDescription() {
            return "You've found where the mob has been meeting. Time to handle them!";
        }
        @Override
        public String getCompletedDescription() {
            if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.getDialogueFlagValueFromId("dsg_elis_eisek_mob_quest_intimidate"))) {
                return "You decided to try and convince the mob to leave Eisek alone with your intimidating physique.";
            } else if (Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.getDialogueFlagValueFromId("dsg_elis_eisek_mob_quest_intimidate_arcane"))) {
                return "You decided to try and convince the mob to leave Eisek alone with your arcane prowess.";
            } else if (Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.getDialogueFlagValueFromId("dsg_elis_eisek_mob_quest_persuade"))) {
                if(!Main.game.isSillyModeEnabled()) {
                    return "You convinced the mob to leave Eisek alone with a heartfelt speech.";
                } else {
                    return "You destroyed the mob's arguments with FACTS and LOGIC.";
                }
            } else if (Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.getDialogueFlagValueFromId("dsg_elis_eisek_mob_quest_seduce"))) {
                return "You convinced the mob to leave Eisek alone by using your mastery of lust magic to fuel an orgy.";
            } else {
                return "You weren't able to convince the mob to leave Eisek alone.";
            }
        }
    },

    EISEK_MOB_QUEST_STAGE_TWO_FAILED(QuestType.SIDE,
            10,
            0) {
        @Override
        public String getName() {
            return "Tossed Out";
        }
        @Override
        public String getDescription() {
            return "You weren't able to convince the mob to leave Eisek alone. You should return to him with the bad news now that you weren't able to handle the mob.";
        }
        @Override
        public String getCompletedDescription() {
            return "You weren't able to convince the mob to leave Eisek alone.";
        }
    },

    EISEK_MOB_QUEST_STAGE_THREE_FAILED(QuestType.SIDE,
            10,
            0) {
        @Override
        public String getName() {
            return "Bad News";
        }
        @Override
        public String getDescription() {
            return "";
        }
        @Override
        public String getCompletedDescription() {
            return "Although he tried to hide it, Eisek seemed upset that the mob is still somewhere out there plotting against him.";
        }
    },

    EISEK_MOB_QUEST_STAGE_THREE(QuestType.SIDE,
            10,
            250) {
        @Override
        public String getName() {
            return "Good News";
        }
        @Override
        public String getDescription() {
            return "You should return to Eisek with the good news now that you've handled the mob.";
        }
        @Override
        public String getCompletedDescription() {
            return "Although he tried to hide it, Eisek seemed pretty happy that the mob will now leave him alone. You even got some rare Dragonfruit.";
        }
    },

    EISEK_SILLYMODE_QUEST_STAGE_ONE(QuestType.SIDE,
            1,
            10) {
        @Override
        public String getName() {
            return "Strange Crowd";
        }
        @Override
        public String getDescription() {
            return "You encountered a different sort of mob that was weirdly obsessed with Eisek. It ultimately came to nothing but you've decided to see what these strange people were all about.";
        }
        @Override
        public String getCompletedDescription() {
            return "You've entered some sort of basement where they've gathered.";
        }
    },

    EISEK_SILLYMODE_QUEST_STAGE_TWO(QuestType.SIDE,
            1,
            10) {
        @Override
        public String getName() {
            return "Darkest Dungeon";
        }
        @Override
        public String getDescription() {
            return "You've followed the basement dwellers back to their basement and decided to have a look inside. Unfortunately they didn't appreciate your trespassing very much and have blocked off the way you came.";
        }
        @Override
        public String getCompletedDescription() {
            return "You're nearly at the exit, only one obstacle remains...";
        }
    },

    EISEK_SILLYMODE_QUEST_STAGE_THREE(QuestType.SIDE,
            1,
            10) {
        @Override
        public String getName() {
            return "Dungeon Cleared";
        }
        @Override
        public String getDescription() {
            return "Having defeated the leader of this strange group, all that's left for you to leave.";
        }
        @Override
        public String getCompletedDescription() {
            return "You've successfully escaped the dungeon and shown a bunch of nerds who is the boss.";
        }
    },
220 lines, filled with quest text with a ton of Java enum abuse. Not really code, but at a glance it kinda looks like it, and if you use KLOC as a metric it does add to the number of lines of Java code.

I tried hard not to cherry-pick these examples, either. I just went into the commits page, clicked on a few random commits, and scrolled down. I spotted these in two out of three of the ones I checked.

You can definitively PR XML stuff but nowhere is it written you can't PR java code
You can ( ) but fixing the fundamental issues is a huge time sink.

Don't get me wrong, Inno has improved substantially as a Java dev, but the old code is not doing this project any favors whatsoever. People have been picking at it here and there, but there's a lot to dig through and it's an error-prone process.

I can't emphasize enough how important it is to get the foundation right the first time. A lot of games wind up abandoned simply because the devs coded themselves into a corner and wound up with an unmaintanable mess. LT has survived as long as it has because it's an incredibly unique game, and probably more than a hint of stubbornness. :)

third: the performance issue i can't really say much but i've use jProfiler and it's really some html webengine stuff doing 60%+ of the time and it's a java thing, not the code.
What you're basically saying here is that if I call a library in an incredibly inefficient way, it's the libraries fault.

So here's the deal. LT calls a fully-featured JavaScript engine to handle simple expression parsing. You can get some pretty significant gains from using a dedicated, lightweight expression parser. Let's be clear: I would be completely on-board with them using JS as a scripting language to decouple some of the game logic from the Java core, but that's not what's happening here.

As for the rest of the web stuff, LT is constantly shoving data into the DOM of a fully-functional web browser to display text. Now I can understand using WebKit to display formatted text. Honestly, it's a pretty convenient way to do that and even if it's slightly slower than using native JavaFX controls it more than makes up for it in simplicity and ease-of-use.

The thing that I doubt anyone can defend is the fact that the game is actually using FIVE webviews at any given time: the main content view, the attributes pane, the map, the buttons at the bottom-left, and the button bar on the bottom. JavaFX has dedicated button and graphics controls, which would have prevented it from having to open up four more instances of WebKit.

Some of the fixes could probably be classified as low-hanging fruit (i.e. switching over the buttons and attribute listing to use JavaFX controls). The map might prove to be a bit more interesting, but axing three WebViews would likely help quite a bit.
 

jujuteux

Newbie
Oct 22, 2017
26
31
[...] third: the performance issue i can't really say much but i've use jProfiler and it's really some html webengine stuff doing 60%+ of the time and it's a java thing, not the code.
aight, i did some checkins and can tell you can't do shit to fix that unless you entirely change stuff for things like JxBrowser and other html renderers that can multithread, render with GPU acceleration and other stuff
 
  • Like
Reactions: Sarkath

jujuteux

Newbie
Oct 22, 2017
26
31
*cracks knuckles* I haven't done one of these kind of posts in a while.
[...]
thanks for taking your time writing something pretty nice

"So here's the deal. LT calls a fully-featured JavaScript engine to handle simple expression parsing. You can get some pretty significant gains from using a dedicated, lightweight expression parser. Let's be clear: I would be completely on-board with them using JS as a scripting language to decouple some of the game logic from the Java core, but that's not what's happening here. "

i don't really get what you mean by that
the data IS parsed, all of it takes about 100ms tops, but the biggest slowdown is the webui loading the raw html text, the average screen is about 500k characters and it takes over 500-1000ms to display it
 
  • Like
Reactions: Sarkath

tehlemon

Well-Known Member
Jan 26, 2021
1,224
1,563
This makes more sense why you guys all act like this. He comes here and reads this stuff, gets upset, and then you get a thrill out of it
Thrill is probably the wrong word. More of a laugh.

I don't know about you, but I hate read reddit on the regular.... Still manage to get my work done.

I mean, I kinda wish more people then just AceXP made actual content modes. And maybe moding in legit quests will be added.

As it is scripting isn't really a thing, you cant have more then an NPC trigger and have some dialog.
Don't distract AceXP, they're busy making the majority of the improvements to this game. I imagine all progress would have stopped by now without them.

alright then
First: if you doubt their work quantity, check their activity on github, not in pulls but in sheer amount of code, and at least double it for anything not XML
the amount of shit done is huge and everytime a mechanic is added it often becomes part of the shit to take into account when making anything new

second: what you described isn't what inno is doing and isn't what i'm doing or telling people to make.
I'm talking about PR'ing it to the github to have it as more than a mod.
i'm not talking about mere XML files, and even for those now you can already start to make significant content and quest stuff with the xml support code.
You can definitively PR XML stuff but nowhere is it written you can't PR java code

third: the performance issue i can't really say much but i've use jProfiler and it's really some html webengine stuff doing 60%+ of the time and it's a java thing, not the code.
Ah yes, the Elon Musk approach to judging quality code. Don't forget to print all those lines off on paper so they can be reviewed. He's definitely demonstrated that it's the best possible way to manage a project and judge how good programmers are at their jobs.

I don't think I need to really explain why everything you said is incorrect, Sarkath did a better job than I would have with way less snark.
 

jujuteux

Newbie
Oct 22, 2017
26
31
Ah yes, the Elon Musk approach to judging quality code. Don't forget to print all those lines off on paper so they can be reviewed. He's definitely demonstrated that it's the best possible way to manage a project and judge how good programmers are at their jobs.

1) this isn't what happened with twitter's problems
2) the line count stands true for over 90% of the meaningful shit, you can give more importance to other classes but in itself that's how it works for any meaningful use in the average project

my work right now is nearing a few thousand lines and pretty much every single one is core to it, any dialogue is XML'd
 

lefteyehawk

New Member
Feb 5, 2018
9
4
i was bored, so i ask chatgpt about this game, it knows this game and the what is.... and chatgpt is at the same time so wrong, try it for a giggle
 

Sarkath

Active Member
Sep 8, 2019
531
908
i don't really get what you mean by that
the data IS parsed, all of it takes about 100ms tops, but the biggest slowdown is the webui loading the raw html text, the average screen is about 500k characters and it takes over 500-1000ms to display it
Things might have improved since the last time I looked at it (it's been well over a year since I've really done a deep dive on the source), but the way the JS engine was called before wasn't very efficient. If I remember correctly, it would set up and tear down the interpreter every time it ran an expression. That is, anything contained within square brackets in the XML, such as "[npc.Name] takes a closer look at [npc.herself]". Plus, "npc.Name" and "npc.herself" would both be evaluated by a heavy JS parser, which is quite heavy.

It's only really used for variable substitution and simple evaluations. Replacing it with a lighter-weight expression parser (Spring EL) sped things up a bit, especially in more complex scenes. I just ran out of free time and couldn't properly test it while the project steamrolled on, lol.

aight, i did some checkins and can tell you can't do shit to fix that unless you entirely change stuff for things like JxBrowser and other html renderers that can multithread, render with GPU acceleration and other stuff
I was honestly kind of surprised at how old and clunky JavaFX's WebKit build seems to be. JxBrowser seems like it would be a good replacement in this case, perhaps with JFX controls for other parts of the UI.

JxBrowser also has its own JS engine. I wonder if that could be used independently of the rendering engine, and if it would outperform Nashorn. Might be worth looking into.
 

BobCarter

Active Member
Jan 28, 2018
944
722
Don't distract AceXP, they're busy making the majority of the improvements to this game. I imagine all progress would have stopped by now without them.
Oh no, we might miss out on more sexual interactions and, what else? Minus a few NPC interactions it's hard to even think of what you mean by improvements to the game.

The small additional drips of content added (striped content) that are added are the only really notable improvements to the game I can think of, and you're saying those aren't what your talking about.

I haven't seen any QoL, Optimizations, or note worthy engine changes minus the bondage applier thing finally working.
 

jujuteux

Newbie
Oct 22, 2017
26
31
Things might have improved since the last time I looked at it (it's been well over a year since I've really done a deep dive on the source), but the way the JS engine was called before wasn't very efficient. If I remember correctly, it would set up and tear down the interpreter every time it ran an expression. That is, anything contained within square brackets in the XML, such as "[npc.Name] takes a closer look at [npc.herself]". Plus, "npc.Name" and "npc.herself" would both be evaluated by a heavy JS parser, which is quite heavy.
yeah inno made her own custom parser, all in all even if it ends slow (i don't think it does, it'd need a lot of parsable stuff) it's far from the biggest problem

I was honestly kind of surprised at how old and clunky JavaFX's WebKit build seems to be. JxBrowser seems like it would be a good replacement in this case, perhaps with JFX controls for other parts of the UI.

JxBrowser also has its own JS engine. I wonder if that could be used independently of the rendering engine, and if it would outperform Nashorn. Might be worth looking into.
iirc there could still be many ways to make the base webEngine faster like async renders for parts of the screen but it clearly ain't there (and would prolly ask for a ton of UI bs)
jxbrowser really seems like the one true way to fix it, in the worst case scenario it's 3x faster, and since it'll allow gpu acceleration and so much more i expect the wait time between anything to be much more affected. it's not like there's complex stuff, just a fuckton of stuff
 
  • Like
Reactions: Sarkath

Demosthenes

Newbie
Nov 28, 2017
50
86
Since I've derailed this thread too much at this point, this is my last post regarding Erosomnia on LT page. Everything else mentioning this game will be in my own (upcoming) thread, for the sake of keeping this one clean. As for a date, I can't make any promises except it's a matter of less than two weeks and a half at worst, but if you're interested in tracking development and getting access to some playable stuff, contact me. (contact info above)
Sorry to bother you in this thread, but it's been a month since you've last said anything regarding your game. Will you be creating a thread for it soon?
 

Skooky

Member
Nov 3, 2021
126
370
Its been 6 years, how are we still not able to actually fully fuck Rose yet? I legit check on this game every quarter to half a year and it feels like we are being cucked with the character, its been 6 damn years and still nothing x.x

Like for a game that focuses pretty heavily on kink play, we are really being limited with one of the first important characters we meet.
I think she's just not into the player character.
 

Draxeid

Newbie
Oct 14, 2018
85
45
I think she's just not into the player character.
First, I don't think that's really an issue for a game like this, and second, Rose quite literally does stuff with us on a couple of occassions, not something you'd normally do with a person you are not into.
 
Last edited:

shiromanoko

New Member
Apr 17, 2023
3
2
Game in developement yet, but it already have a lot of content. Spent my time to finish what`s out yet, got a little bit sad that there are no more quests, but game is good.
 
  • Like
Reactions: johnson.lv42

Sarkath

Active Member
Sep 8, 2019
531
908
yeah inno made her own custom parser, all in all even if it ends slow (i don't think it does, it'd need a lot of parsable stuff) it's far from the biggest problem
Yeah, I remember memory allocations being a pretty big issue, especially at the end of a turn. The game seems to allocate, populate, and dispose of a ton of lists fairly rapidly, to the point where available memory bandwidth makes a significant difference. The game would perform okay on systems with a dedicated GPU or systems but would flounder on standard DDR4 systems with an iGPU. That sort of thing would generally only happen when you did a lot of breeding, given that it's tied to NPC count, but it's something that could naturally happen as the game world itself expands.

Life ended up getting kind of busy for me around when I was trying to untangle that, so I wasn't able to get too deep into that issue. I might start to look into it again now that things are settling down…we'll see.

It's worth noting that someone (AceXP, I think) improved the offspring system to mitigate this issue. I think the workaround here was to only initialize offspring NPCs when the player actually encounters them into the world.

jxbrowser really seems like the one true way to fix it, in the worst case scenario it's 3x faster, and since it'll allow gpu acceleration and so much more i expect the wait time between anything to be much more affected.
Holy shit, that's a pretty solid improvement.

it's not like there's complex stuff, just a fuckton of stuff
Yeah, not to mention an eternity of testing. Implementing new features is always a lot more fun than refactoring/rewriting old code. Plus, it's kind of hard to justify to the end user why you need to spend X amount of time rewriting something that "works perfectly fine" (and knowing what I know about many computer users, the damn thing could be on fire and spewing out plumes of radioactive gas and they'd still say it "works fine," lol).
 
4.10 star(s) 123 Votes