HTML Sluttown USA: Hometown Corruption [v0.34] [AmusingOddity]

3.60 star(s) 26 Votes

B10

Member
Jun 25, 2017
339
143
For Leah I'm at 24/25 and it keeps saying.

You don't have permission to view the spoiler content. Log in or register now.

I waited already a month I think.

Found it attune at night gym.
 

AmusingOddity

Member
Game Developer
May 11, 2021
318
837
Found a bug in teh code that was sticking you in a loop. I have a bugfix up on the front page that addresses it. IF you use this save you should be good to go. Thanks for prining the bug to my attention.

Is it possible to pimp your sisters in the brothel?
The only people that are going to be working in the brothel for now are the girls that are getting recruited. When I get around to doing peoples public arcs, some of them might be willing to pick up shifts in the brothel once it's open. It'll be a character by character thing.
 

katabasi

Well-Known Member
Jun 6, 2017
1,625
1,206
"If you need the full game, download all three packs, select them together and extract. They should extract into the same folder."
it doesnt work
 

AmusingOddity

Member
Game Developer
May 11, 2021
318
837
"If you need the full game, download all three packs, select them together and extract. They should extract into the same folder."
it doesnt work
If you dont have 7-zip, you might need to do it one by one and just merge them.
 

Virulenz

Engaged Member
Sep 27, 2017
2,754
3,456
You may need to fix some numbers on private routes:

Jessica
This is the end of currently available content for this arc. Please check back in future updates for more. Pin Unpin
Story Progress: 14 of 15

Romi
This is the end of currently available content for this arc. Please check back in future updates for more. Pin Unpin
Story Progress: 12 of 13

Sara
This is the end of currently available content for this arc. Pin Unpin
Story Progress: 20 of 11

I mean, end of story means all done...and i looked for "hidden" stuff on every day at every time each a whole week, there is no missing content so the numbers are wrong.
 

ipaqi

Newbie
May 5, 2017
22
44
So, in the interest of making one-handed navigation of this game more feasible on computers (wink-wink), I decided to try my hand at importing the link+keyboard logic from College Daze. I then added logic that puts those links on the location buttons as well, except for the home and kill time shortcuts. The button link order is top-left to bottom-right, but some layouts end up being a little weird.

1709904173113.png

Still, that's as much effort as I'm willing to put into this.

Since this code is generic and can be pulled into most twine/Sugarcube games, I'm not going to share a full HTML file, just the script.

You don't have permission to view the spoiler content. Log in or register now.


JavaScript:
var KBIntervalID = 0;
function UpdateLinks(e) {
    if (!tags().includes("DisableKeyLinks")) {
        var t,
        n = void 0 === e ? (e = document, $("#passages a").toArray()) : $(e).find("a").toArray();
        var b = void 0 === e ? (e = document, $("button[onclick*=\"<<goto\"").toArray()) : $(e).find("button[onclick*=\"<<goto\"").toArray();
        b.sort(function(first, second) {
          //sort by x, secondary by y
          var x1 = parseFloat($(first).css("left"));
          var y1 = parseFloat($(first).css("top"));
          var x2 = parseFloat($(second).css("left"));
          var y2 = parseFloat($(second).css("top"));
          return y1 == y2 ? x1 - x2 : y1 - y2;
        });
        n.push(...b);
        
        if (0 < n.length)
            for (t = 0; t < n.length; t++)
                "true" != n[t].getAttribute("data-nokey") &&
                "true" != n[t].parentElement.getAttribute("data-nokey") &&
                !n[t].parentElement.classList.contains("HomeButton") &&
                !n[t].parentElement.classList.contains("TimeButton") ||
                (n.deleteAt(t), t--);
        if (1 === n.length)
            n[0].id.includes("Link") || (n[0].id = "NextLink", $("<sup>[D]</sup>").appendTo(n[0]));
        else if (1 <= n.length && n.length <= 20)
            for (t = 0; t < n.length; t++){
                //if(n[t].tagName == "button" && n[t].getAttribute("onclick").contains(""
                n[t].id.includes("Link") || (t < 9 ? ($("<sup>[" + (t + 1) + "]</sup>").appendTo(n[t]), n[t].id = "Link" + (t + 1)) : 9 === t ? ($("<sup>[0]</sup>").appendTo(n[t]), n[t].id = "Link0") : ($("<sup>[" + "qwertyuiop".charAt(t - 10) + "]</sup>").appendTo(n[t]), n[t].id = "Link" + t))
            }   
    }
}
function utilSlugify(e) {
    var e = String(e).trim(),
    t = e.replace(/[^\w\s\u2013\u2014-]+/g, "").replace(/[_\s\u2013\u2014-]+/g, "-").toLocaleLowerCase();
    return /^-*$/.test(t) ? e.replace(/[\x00-\x20!-/:-@[-^`{-\x9f]+/g, "").replace(/[_\s\u2013\u2014-]+/g, "-") : t
}
$(document).on(":passagerender", function (e) {
    clearInterval(KBIntervalID),
    UpdateLinks(e.content),
    KBIntervalID = setInterval(UpdateLinks, 300)
});
$(document).on("keyup", function (e) {
    if (!tags().includes("DisableKeyLinks"))
        switch (68 != e.keyCode && 39 != e.keyCode && 97 != e.keyCode || !$("#NextLink") || tags().includes("IgnoreArrowKeys") && "ArrowRight" == e.key || (e.preventDefault(), $("#NextLink").click()), 47 < e.keyCode && e.keyCode < 58 && $("#Link" + (e.keyCode - 48)) && (e.preventDefault(), $("#Link" + (e.keyCode - 48)).click()), 95 < e.keyCode && e.keyCode < 106 && $("#Link" + (e.keyCode - 96)) && (e.preventDefault(), $("#Link" + (e.keyCode - 96)).click()), 65 != e.keyCode && 37 != e.keyCode && 192 != e.keyCode || tags().includes("IgnoreArrowKeys") && 65 == e.keyCode || (e.preventDefault(), Engine.backward()), e.keyCode) {
        case 81:
            e.preventDefault(),
            $("#Link10").click();
            break;
        case 87:
            e.preventDefault(),
            $("#Link11").click();
            break;
        case 69:
            e.preventDefault(),
            $("#Link12").click();
            break;
        case 82:
            e.preventDefault(),
            $("#Link13").click();
            break;
        case 84:
            e.preventDefault(),
            $("#Link14").click();
            break;
        case 89:
            e.preventDefault(),
            $("#Link15").click();
            break;
        case 85:
            e.preventDefault(),
            $("#Link16").click();
            break;
        case 73:
            e.preventDefault(),
            $("#Link17").click();
            break;
        case 79:
            e.preventDefault(),
            $("#Link18").click();
            break;
        case 80:
            e.preventDefault(),
            $("#Link19").click()
        }
});
Credit for the vast majority of this logic goes to G28 etc, as I lifted most of it from his game
 

Ferretclyde

New Member
Apr 30, 2021
1
0
You need ti make download and getting to this game easier. trying to extract and run all 3 packs for 0.33 is a pain in the ass.
 

ipaqi

Newbie
May 5, 2017
22
44
So, in the interest of making one-handed navigation of this game more feasible on computers (wink-wink), I decided to try my hand at importing the link+keyboard logic from College Daze. I then added logic that puts those links on the location buttons as well, except for the home and kill time shortcuts. The button link order is top-left to bottom-right, but some layouts end up being a little weird.

View attachment 3422369

Still, that's as much effort as I'm willing to put into this.

Since this code is generic and can be pulled into most twine/Sugarcube games, I'm not going to share a full HTML file, just the script.

You don't have permission to view the spoiler content. Log in or register now.


JavaScript:
var KBIntervalID = 0;
function UpdateLinks(e) {
    if (!tags().includes("DisableKeyLinks")) {
        var t,
        n = void 0 === e ? (e = document, $("#passages a").toArray()) : $(e).find("a").toArray();
        var b = void 0 === e ? (e = document, $("button[onclick*=\"<<goto\"").toArray()) : $(e).find("button[onclick*=\"<<goto\"").toArray();
        b.sort(function(first, second) {
          //sort by x, secondary by y
          var x1 = parseFloat($(first).css("left"));
          var y1 = parseFloat($(first).css("top"));
          var x2 = parseFloat($(second).css("left"));
          var y2 = parseFloat($(second).css("top"));
          return y1 == y2 ? x1 - x2 : y1 - y2;
        });
        n.push(...b);
       
        if (0 < n.length)
            for (t = 0; t < n.length; t++)
                "true" != n[t].getAttribute("data-nokey") &&
                "true" != n[t].parentElement.getAttribute("data-nokey") &&
                !n[t].parentElement.classList.contains("HomeButton") &&
                !n[t].parentElement.classList.contains("TimeButton") ||
                (n.deleteAt(t), t--);
        if (1 === n.length)
            n[0].id.includes("Link") || (n[0].id = "NextLink", $("<sup>[D]</sup>").appendTo(n[0]));
        else if (1 <= n.length && n.length <= 20)
            for (t = 0; t < n.length; t++){
                //if(n[t].tagName == "button" && n[t].getAttribute("onclick").contains(""
                n[t].id.includes("Link") || (t < 9 ? ($("<sup>[" + (t + 1) + "]</sup>").appendTo(n[t]), n[t].id = "Link" + (t + 1)) : 9 === t ? ($("<sup>[0]</sup>").appendTo(n[t]), n[t].id = "Link0") : ($("<sup>[" + "qwertyuiop".charAt(t - 10) + "]</sup>").appendTo(n[t]), n[t].id = "Link" + t))
            }  
    }
}
function utilSlugify(e) {
    var e = String(e).trim(),
    t = e.replace(/[^\w\s\u2013\u2014-]+/g, "").replace(/[_\s\u2013\u2014-]+/g, "-").toLocaleLowerCase();
    return /^-*$/.test(t) ? e.replace(/[\x00-\x20!-/:-@[-^`{-\x9f]+/g, "").replace(/[_\s\u2013\u2014-]+/g, "-") : t
}
$(document).on(":passagerender", function (e) {
    clearInterval(KBIntervalID),
    UpdateLinks(e.content),
    KBIntervalID = setInterval(UpdateLinks, 300)
});
$(document).on("keyup", function (e) {
    if (!tags().includes("DisableKeyLinks"))
        switch (68 != e.keyCode && 39 != e.keyCode && 97 != e.keyCode || !$("#NextLink") || tags().includes("IgnoreArrowKeys") && "ArrowRight" == e.key || (e.preventDefault(), $("#NextLink").click()), 47 < e.keyCode && e.keyCode < 58 && $("#Link" + (e.keyCode - 48)) && (e.preventDefault(), $("#Link" + (e.keyCode - 48)).click()), 95 < e.keyCode && e.keyCode < 106 && $("#Link" + (e.keyCode - 96)) && (e.preventDefault(), $("#Link" + (e.keyCode - 96)).click()), 65 != e.keyCode && 37 != e.keyCode && 192 != e.keyCode || tags().includes("IgnoreArrowKeys") && 65 == e.keyCode || (e.preventDefault(), Engine.backward()), e.keyCode) {
        case 81:
            e.preventDefault(),
            $("#Link10").click();
            break;
        case 87:
            e.preventDefault(),
            $("#Link11").click();
            break;
        case 69:
            e.preventDefault(),
            $("#Link12").click();
            break;
        case 82:
            e.preventDefault(),
            $("#Link13").click();
            break;
        case 84:
            e.preventDefault(),
            $("#Link14").click();
            break;
        case 89:
            e.preventDefault(),
            $("#Link15").click();
            break;
        case 85:
            e.preventDefault(),
            $("#Link16").click();
            break;
        case 73:
            e.preventDefault(),
            $("#Link17").click();
            break;
        case 79:
            e.preventDefault(),
            $("#Link18").click();
            break;
        case 80:
            e.preventDefault(),
            $("#Link19").click()
        }
});
Credit for the vast majority of this logic goes to G28 etc, as I lifted most of it from his game
New version of this code, fixes an issue where you couldn't properly fill in text boxes because the back and forward shortcuts got a higher priority


JavaScript:
var KBIntervalID = 0;
function UpdateLinks(e) {
    if (!tags().includes("DisableKeyLinks")) {
        var t,
        n = void 0 === e ? (e = document, $("#passages a").toArray()) : $(e).find("a").toArray();
        var b = void 0 === e ? (e = document, $("button[onclick*=\"<<goto\"").toArray()) : $(e).find("button[onclick*=\"<<goto\"").toArray();
        b.sort(function(first, second) {
          //sort by x, secondary by y
          var x1 = parseFloat($(first).css("left"));
          var y1 = parseFloat($(first).css("top"));
          var x2 = parseFloat($(second).css("left"));
          var y2 = parseFloat($(second).css("top"));
          return y1 == y2 ? x1 - x2 : y1 - y2;
        });
        n.push(...b);
        
        if (0 < n.length)
            for (t = 0; t < n.length; t++)
                "true" != n[t].getAttribute("data-nokey") &&
                "true" != n[t].parentElement.getAttribute("data-nokey") &&
                !n[t].parentElement.classList.contains("HomeButton") &&
                !n[t].parentElement.classList.contains("TimeButton") ||
                (n.deleteAt(t), t--);
        if (1 === n.length)
            n[0].id.includes("Link") || (n[0].id = "NextLink", $("<sup>[D]</sup>").appendTo(n[0]));
        else if (1 <= n.length && n.length <= 20)
            for (t = 0; t < n.length; t++){
                n[t].id.includes("Link") || (t < 9 ? ($("<sup>[" + (t + 1) + "]</sup>").appendTo(n[t]), n[t].id = "Link" + (t + 1)) : 9 === t ? ($("<sup>[0]</sup>").appendTo(n[t]), n[t].id = "Link0") : ($("<sup>[" + "qwertyuiop".charAt(t - 10) + "]</sup>").appendTo(n[t]), n[t].id = "Link" + t))
            }   
    }
}
function utilSlugify(e) {
    var e = String(e).trim(),
    t = e.replace(/[^\w\s\u2013\u2014-]+/g, "").replace(/[_\s\u2013\u2014-]+/g, "-").toLocaleLowerCase();
    return /^-*$/.test(t) ? e.replace(/[\x00-\x20!-/:-@[-^`{-\x9f]+/g, "").replace(/[_\s\u2013\u2014-]+/g, "-") : t
}
$(document).on(":passagerender", function (e) {
    clearInterval(KBIntervalID),
    UpdateLinks(e.content),
    KBIntervalID = setInterval(UpdateLinks, 300)
});
$(document).on("keyup", function (e) {
    if (!tags().includes("DisableKeyLinks") && e.target.type != "text")
        switch (68 != e.keyCode && 39 != e.keyCode && 97 != e.keyCode || !$("#NextLink") || tags().includes("IgnoreArrowKeys") && "ArrowRight" == e.key || (e.preventDefault(), $("#NextLink").click()), 47 < e.keyCode && e.keyCode < 58 && $("#Link" + (e.keyCode - 48)) && (e.preventDefault(), $("#Link" + (e.keyCode - 48)).click()), 95 < e.keyCode && e.keyCode < 106 && $("#Link" + (e.keyCode - 96)) && (e.preventDefault(), $("#Link" + (e.keyCode - 96)).click()), 65 != e.keyCode && 37 != e.keyCode && 192 != e.keyCode || tags().includes("IgnoreArrowKeys") && 65 == e.keyCode || (e.preventDefault(), Engine.backward()), e.keyCode) {
        case 81:
            e.preventDefault(),
            $("#Link10").click();
            break;
        case 87:
            e.preventDefault(),
            $("#Link11").click();
            break;
        case 69:
            e.preventDefault(),
            $("#Link12").click();
            break;
        case 82:
            e.preventDefault(),
            $("#Link13").click();
            break;
        case 84:
            e.preventDefault(),
            $("#Link14").click();
            break;
        case 89:
            e.preventDefault(),
            $("#Link15").click();
            break;
        case 85:
            e.preventDefault(),
            $("#Link16").click();
            break;
        case 73:
            e.preventDefault(),
            $("#Link17").click();
            break;
        case 79:
            e.preventDefault(),
            $("#Link18").click();
            break;
        case 80:
            e.preventDefault(),
            $("#Link19").click()
        }
});
 

Ace_daddy

New Member
May 8, 2022
13
5
Hit F12 and your browser will pop up a Javascript console window to the right of the VN. I'm going to paste this screenshot of my chromium with the javascript console open. Note that I've already done the things that I will talk about next.
View attachment 1341295

The first thing I did was type "Sugarcube.State.variables.charge" at the ">" prompt in that window and hit enter. That returns a 0 which is the current charge on the phone as you can see in the content window as "Charge: 0". Note that as you type, the console will automatically populate a popdown list with possible completions. So after typing only "Sugar" I can just hit the right arrow key and it will fill that out as "SugarCube". Then I typed ".State.var" and that was enough to let me hit the right arrow key again to have it fill out "variables". So you don't have to type all this everytime and worry about it being incorrect.

I hit the "up arrow" key to recall all of that and just typed "=40" to set it to 40. Note that the content window on the left is in suspended animation while the console is open. So that "Charge: 0" won't change to "Charge: 40" until after I close the console window by clicking the "x" gadget in its upper right and then click something to go into the next passage.

I did "up arrow" again and then used backspace to erase the ".charge". This showed all of the variables in effect for the VN but as a "closed two line tree between "{" and "}" with a small ellipses "..." at the very right. To open it up as the full scrollable list I clicked on that "..." and we see the first page full of variables and values. I can now use "up arrow" and then type out individual variable names to peek and then use "=" with a new value to poke.

Congratulations. You now know how to hack 95% of Twine games since just about everybody uses SugarCube format and don't know how to change where the variable storage is hidden.
does this still work?? cause it keeps saying sugarcube in not defined
 

scarfer

Active Member
Nov 4, 2017
634
321
If you're trying to use SugarCube on a third party online host, such as Mopoga, it won't work. If you've downloaded the game, it should
 

Rhazes

Member
Dec 29, 2019
232
293
How is this game for someone who wants to corrupt women but not actually have sex with them. I'm more interested in watching them ruin their lives with other men.
 
Jan 18, 2021
237
415
does this still work?? cause it keeps saying sugarcube in not defined
You need to use the correct capitalization. Sugarcube will not work. sugarcube will not work either. But SugarCube will work. So there is a typo in phpudup's instructions: the correct spelling/capitalization is SugarCube.State.variables.charge
Note that most browsers allow you to start typing the first few letters of a variable name and then press Tab or right-arrow to expand it to the full name, which saves some typing and ensures that you get the correct spelling.
what sisification have here
Elliot (cousin or neighbor) can be turned into a sissy and will be more or less happy about it depending on your choices.
How is this game for someone who wants to corrupt women but not actually have sex with them. I'm more interested in watching them ruin their lives with other men.
This game focuses on the MC corrupting women mostly for his own benefit. Even if you select the "public" route for the women that have it as an option, there are still several sex scenes with the MC.
 

Ace_daddy

New Member
May 8, 2022
13
5
alright a lil help guys, i download all 3 parts but then i extract all and nothing happens, what should i do
 

AmusingOddity

Member
Game Developer
May 11, 2021
318
837
alright a lil help guys, i download all 3 parts but then i extract all and nothing happens, what should i do
Place all extracted parts into the same folder. You should end up with 1 folder called Sluttown USA that's about 4.9 gig.
 
3.60 star(s) 26 Votes