BaloneyAmone

Active Member
Mar 3, 2021
523
957
Even so conversation about it pops up in the wierdest of places. Last time for me was in the middle of a "Blastphemous Bible" stream.
In my defense, the guy behind it is an example of a lolcow among erotic game devs that most people probably know about, so I figured it was worth cursing the thread with its name to get my point across.
 

tehlemon

Well-Known Member
Jan 26, 2021
1,223
1,556
For all her productivity failings, Innoxia does a pretty good job staying composed and not embarrassing herself in public forums, and besides that this game isn't that widespread or ambitious compared to something like Yandere Simulator, so most likely not.
If she, say, she came into this forum armed with dual SA80s with the intention of verbally gunning down all the haters, then you'd maybe get a little bit of traction in that direction, but given her history of being very disciplined in that regard, I'd highly doubt such an event would come to pass.
That's only because she knows to keep everything to her discord where the mods will delete anything that looks too bad.

Like, we know she hate reads this thread sometimes. And we know she used to hate read the blog comments. We know this because she likes to bitch about this thread on discord whenever that happens. And because she's commented on stuff happening here in the blog a few times.

Also, just so everyone is aware, we're right back on track for our yearly schedule. One half finished update early in the year after the holidays are over. One update mid summer, usually something reasonable. And then one more half assed update before the holiday delays start again.
 

BobCarter

Active Member
Jan 28, 2018
841
602
That's only because she knows to keep everything to her discord where the mods will delete anything that looks too bad.

Like, we know she hate reads this thread sometimes. And we know she used to hate read the blog comments. We know this because she likes to bitch about this thread on discord whenever that happens. And because she's commented on stuff happening here in the blog a few times.

Also, just so everyone is aware, we're right back on track for our yearly schedule. One half finished update early in the year after the holidays are over. One update mid summer, usually something reasonable. And then one more half assed update before the holiday delays start again.
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
 

jujuteux

Newbie
Oct 22, 2017
20
19
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
imo in general for people bitching about content they want that ain't there, they should consider making it themselves
there's a modding channel in the discord server and a github for it

Is there a mod for portal panties, that would be so awesome. Leaving them at the brothel so people can use you even when your out and you sporadically drop in to collect your ernings.
it's maybe 2-3 years old but i'm currently making a portal mod
portal panties, fleshlights, anything pretty much, 'cept the whole "creating floating portals in the middle of nowhere"

been working with another dude to make it both realistically possible and broad enough, allowing you to:
-enchant clothes with portal enchantments, aimed at individual orifices/members
-applying portals to gloryhole locations/valid locations
-linking those portals together with a channel name
-configuring special parameters to those portals (ex: instead of having portal panties to be penetrated with, flipping it around into a portal strapon, using the portal partner's member. linking a portal to a milking room to harvest their fluids/replenishing theirs faster or mixing it with another liquid...)
-allowing the portals to be used both in and outside of sex
-adding custom behaviours to the other side's portal (ex: them being spent/tired/satisfied/ready for more)
-adding custom events when a portal-bearing clothing is dropped in an unsafe zone, with who takes it being dependent on many different factors (ex: when a non-unique nobody picks it up, create a schedule they follow day+night for when available)

with future additions being:
-Bra of Holding option (void, void?, bra of devouring) with other sex areas being allowed too (idea from GNG's stuff)
-finding out a foe's portal link name to defeat them near instantly in fight (if they have any)
-the related quest allowing you to use portal magic and its enchantments (too long for this post)
 

BaloneyAmone

Active Member
Mar 3, 2021
523
957
imo in general for people bitching about content they want that ain't there, they should consider making it themselves
there's a modding channel in the discord server and a github for it
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.
 

BobCarter

Active Member
Jan 28, 2018
841
602
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.
 
  • Like
Reactions: BaloneyAmone

jujuteux

Newbie
Oct 22, 2017
20
19
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
506
846
*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
20
19
[...] 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
20
19
*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,223
1,556
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
20
19
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
506
846
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
841
602
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
20
19
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
84
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
118
332
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.
 
4.10 star(s) 118 Votes