Fattening Career - 3D weight gain visual novel (0.10 released for Free!)

@Illuminated_Otter Thank you, this will certainly help.

@ScoliosisWarrior She might get her own story.

@heavyweaponsguy Sound/Music is planned but this is low on the priority list, so it might take a while before i get to it.

@SexyFatGirlRenders A couple sex scenes were done by a friend of mine(Expanding Universe Games). Their dialogue contains a few {w} thingies. I think the way he uses them works really well.

3 Likes

very fun but but it takes very long to get anywhere and so much repeating i get bored after a while lol it needs some trimmin which is problem for most renpy games i guess :stuck_out_tongue: like if i gotta watch the teach strip 1 more time :sweat_smile: will there be a way to skip the pill stuff im not really into that type of gainin or is it gonna be a main thing and i can only get 2 of the store girls to gain none of the others. also the stuff from the store cost way to much either lower the price or make more at work. i think i can see where its goin and i cant wait to see it :slight_smile:

2 Likes

What you need here really is a least recently used list. @Illuminated_Otter’s approach is good, as there are fewer entries in the boudary list than members to select from so very recent picks cannot be reselected. For RenPy use you may need to change the constructor to not take a copy of the members list (declare the initial list with default too so it is persisted in save games) so it remains a RenpyRevertableList rather than a pure Python one and adjusts its state correctly during roll-back/roll-forward.

Tramp does something similar with its Picker class (source is available in the download), but is solving a slightly different problem where the number of options available can vary and each has its own priority and weight.

5 Likes

Is Lyn coming back after choosing “You’re Lyn” or “You’re Leanne”?

3 Likes

Yes, in the next update as explained before.

4 Likes

@dingotush Thanks for the tip, and thanks for letting me have a look at the Tramp source code.
I will soon take some time to figure out all the code for the randomized Bunny Bites customers.

2 Likes

Apologies for anything in my example that’s not RenPy friendly! Like I said - I know Python pretty well, but I’ve never coded for RenPy so have no idea on its quirks.

2 Likes

No problem - RenPy has quite a few poorly documented quirks that even people who use it aren’t necessarily aware of! In this case it quietly replaces Python collections with its own revertable versions. I suspect it does this when they are added to the renpy.store namespace, but I’ve never tracked it down - it could also be when it tokenizes the RenPy script.

The renpy.store keeps old versions of its contents (pickled I think) so that when you roll-back or roll-forward it automagically adjusts its state to how it was at that point in the game. The Revertable collection types are to play nicely with this - I think they add “dirty” flags to indicate when they’ve been mutated. If you have native Python collections they won’t always participate in rollback, and things can get out of sync.

2 Likes

Okay, so, uh, this could be a problem for me potentially. I need to “cheat” to fix it.

default Wcounter = 0
default thislist = ["",""]
default searchstring = ""

init python:
    import time
    import re


    voicedwordslist = ["what the","belch","zipper"]#longerforreal

Could I change this to:

default Wcounter = 0
default thislist = ["",""]
default searchstring = ""
default voicedwordslist = [""]

init python:
    import time
    import re


    voicedwordslist = ["what the","belch","zipper"]#longerforreal

And now have it magically work and respect rollbacks?

Also, uh, I already have this code:
Near top:

default name = "Josh"

Lower down:

    python:
        name = renpy.input("What's your character's name?")

        name = name.strip() or "Josh"

I assume this example using variable name makes renpy rollback properly?

2 Likes

Some feedback for future versions:

It would be a nice feature to be able to view a slide show progression of the characters from the stats page. Either once the story is complete or as it progresses. It would also be nice to be able to rerun a section of a character’s journey from the stats page without having to rely on saves.

2 Likes

So the golden rule is to always declare things with either define (for “constants” - that could be different in later versions) or default (for proper variables) and never let RenPy guess by declaring stuff in a Python block or line.

Which you need for you voicedwordslist depends on how you are using it.
Note: I’d recommen looking at the Python Style Guide for naming conventions.

If it is just a list of words that you pick from then go with define. This has the advantage that it won’t be persisted in a save game and if you add more words or fix a spelling/typo in a later version of your game the changes will be picked up when the player loads their old save. Since it won’t change a tuple is convenient over a list:

define voiced_words_list = (
    "what the",
    "belch",
    "zipper",
)

If the list is going to change over the course of play you should use default. This will mark it to be persisted in the save game. If you do need to add to or fix up the list in a later version of your game you’ll have trouble as the defaulted value will be overwritten by the loaded save. You’ll need to look at using the magic label after_load. This allows you to run code after a save is loaded and before it starts running.

default voiced_words_list = [
    "what the",
    "belch",
    "zipper",
]

Your player name stuff will be fine as it is declared with default. Because it’s Python you could choose to do that all on one line:

$ name = renpy.input("What's your character's name?").strip() or "Josh"

It might be wise to specify a maximum length (so as not to throw out the length of say text) and force capitalize the first letter:

$ name = renpy.input("What's your character's name?", length=16).strip().capitalize() or "Josh"
2 Likes

Very important your reply. I absolutely NEED to use define. As voicedwordslist will change almost every single update to the game, but never during gameplay.
It’s a list of all sound effects, so if a new sound effect is added it will be changed, this will only happen due to new content being added, or fixing of typos.
This makes me think though that many of the default in my code currently need to be changed to define for similar reasons.

The following is wildly offtopic so I’ll spoiler it for everyone who isn’t dingotush.

A tuple won’t be good though because the list is added to a few times during a python init: block. Actually wait… dangit, if I use define that won’t work.
What I need is for it to allow me to edit it, but NOT be saved in the save files. I need to be allowed to edit it during my python init but never later… ugh.

This is the code that makes me stuck here.

    for tempstr1 in synonymDict.keys():
        voicedwordslist = voicedwordslist + synonymDict[tempstr1]

Hmm, is there anyway to run my init python block before my default and define’s are run?

So I could do
init python:
voicedwords=stuff
for loop voicedwordslist = voicedwordslist + synonymDict[tempstr1]
end block of python
define voicedwordslist = voicedwordslist

Hmm. I actually do this a lot. I have a lot of variables that are generated during init python. That I would like to freeze in a manner similar to renpy’s define after init python: and before label start:

I’ve also got this funky bit planned for the future, also inside my init python: block

    global voicedwordsDictionary
    voicedwordsDictionary = {
            "Gertha" : voicedwordslist,
            "Narrator" : [x for x in voicedwordslist if x not in ["hurry up","what the"]]
        }

Although in this case maybe I could have voicedwordslist exist only in python code and have voicedwordsDictionary be the define version of it that ren’py will control/use?

2 Likes

Is it possible to save your data from earlier versions or do you have start from the beginning in new versions?

Love the game!

3 Likes

Fattening Career is a game that uses the RenPy engine. Renpy game’s have a persistent data folder that is saved in a different location than the game files( The file pathway on windows will look something like this: C:/Users/what you named your computer or username/AppData/Roaming/RenPy/FatteningCareer ) whenever you start a game and make a save. So, unless you have deleted this folder you will have old save info between versions. However, the game is still a WIP and things are constantly being updated between versions. If you use an old save you are very likely to encounter errors, bugs, etc. unless otherwise stated by the dev. In most cases there are likely variables and code that didn’t exist between the different versions and using an old save has a likelihood of causing issues.

7 Likes

I agree 100% with @Krodmandoon.

If the dev has made even minor changes to the variables between versions, you’ll almost certainly come across errors and crashes if you try and load a save from a previous version.

Plus, from a dev point of view, there’s almost nothing more frustrating than having a bug reported to you and spending hours trying to track it down, only to learn that it’s been caused by loading an old save.

9 Likes

@luuv2fatten
I will be adding an option to cycle through the portrait images for the characters their stages on the stats page.
Redoing story events is something I don’t think I will add as a feature, but maybe I will change my mind later.

@eurekablonde
Like Krodmandoon said, you will retain saves on the machine you are playing on.
But right now loading saves from older updates will break your game
In the future, when the game enters beta I will be doing my best to keep saves compatible, but this isn’t for a while.

7 Likes

From experience, it’s very difficult to make saves compatible.

I found the best solution was simply to put a very clear message at the start of my game saying old saves will NOT work. Not that everyone reads pre-game messages, of course :stuck_out_tongue:

4 Likes

@tiggertoo Another developer @expandinguniversegam, has shown me a way to keep saves compatible while adding new content that requires new variables, the only issue I’m facing currently that keeps me from doing this is the fact that I’m still changing a lot of the content that is currently in the game. When I enter beta I won’t be touching the existing content anymore(Unless its some bug or typo) and instead I will just keep adding content until the game is finished.

1 Like

How hard is it to add new variables without breaking saves? Is there a guide on it somewhere? maybe on Welcome to Ren'Py's documentation! — Ren'Py Documentation somewhere?

Is your method slash @expandinguniversegam 's method based on using after_load as dingotush hinted at?

2 Likes

It’s mostly setting defaults.

Say you add a choice to an earlier section of the game about whether or not to eat cheesecake, and you refer to that choice later. It breaks the save when the save was made after that choice, because the playthrough didn’t take that choice into account.

Adding a default (default eatcheesecake = True) makes the game assume the choice was made and lets it continue on without causing an error message every time that variable is referred to.

So easy enough in a story based VN, but still doesn’t solve everything in a sandbox game, like in Fattening Career or Weighting Game.

4 Likes