Hi there, been posting for quite a while now. SexyFatGirlRenders

Making this a seperate post because this is an important daz3d fact/tip/tool.

Dear future me, Clothing with dforce already on it has had a dforce weight map node child object created for it, then painted, then deleted. The object remembers the paint in order to access this weight map and edit it you simply create the dforce weight map node for an object again from the create menu. Then repaint/edit the influence weight map. This allows you to rub out silly things like … low cut stiff collars, no physical low cut top is also stiff necked.

1 Like

Still trying to sort out UI.

It’s a giant time sink.

But I did learn how to combine grid: with fixed: at least :stuck_out_tongue:

2 Likes

Finally showing large page numbers and added 10x advance pages buttons, I feel like these should be standard features in renpy, and my code for them is jank, but well, they seem to work so far.

Had to read the ren’py code on the source github to figure this one out :stuck_out_tongue:

2 Likes

Yes/No Maybe?

https://www.soundgator.com/search/?keyword=click

I grabbed like a dozen of my favorites and then fed them into the code such that every custom menu screen button when clicked will play a random sound from the folder of sounds I am considering to choose to use :stuck_out_tongue:

I’ve been worried the custom menus could be confusing otherwise (since most people are used to in renpy mostly just basic default menu: choices.

1 Like

tooltips and menu buttons can now check and respect time and keep track of hours of operation:

Next I plan to implement NPC’s having schedules and being at different locations for various reasons :stuck_out_tongue:

Pretty slow going, and I’m spending a lot of time pasting incorrect code into the ren’py discord, but hey, I’m learning :smiley:

1 Like

The map now has context awareness for where npcs are on an npc schedule for each time slot.

I haven’t figured out how I am going to sort through which events should fire if more than one npc is present at a map location.

I also need to decide if clicking on the girl’s face on the map should take you to your notebook and her bio-stats page or if clicking on her head, which is on top of the map location button should instead just count as clicking the button under her and take you to that location.

Thoughts?

1 Like

Now that the overlay toolbar has time of day and week and day and all that on it, it feels both crowded and… somehow ugly

It looked a lot better with no day, no time, and the week set to N/A :stuck_out_tongue:

Although I am happy so far with how well I am doing at showing lots of information on the screen at once, I’m not happy with how much worse the screen looks as a result.

1 Like

I think it matters much more how you do highlighting on hover (if you do highlighting). If you highlight the whole box, it is obvious you are taking the user to the location. If you highlight just her head, I would expect it to take you to her page.

Would morning turning red when moused over make you automatically think clicking there would advance 1 time slot :stuck_out_tongue: ?

1 Like

It would make me think I could interact with the time somehow. I’m not sure if I would automatically assume it would advance time so much as just let me see something more in depth about the time. You might want a separate fast forward arrow or similar to denote skipping ahead through time.


Detailed notes hidden i descriptions of New Fat Bottomed Blonde Test1 by SexyFatGirlRenders on DeviantArt New Fat Bottomed Blonde Test2 D-Angle by SexyFatGirlRenders on DeviantArt New Fat Bottomed Blonde Test2 Close Up Portrait by SexyFatGirlRenders on DeviantArt

2 Likes

Once the player realizes the red time means something, they can click it, that’s when the explanation screen popups up. I can’t think of a better method ATM, although maybe you’re right a fast forward arrow could work, and it could appear when valid and disappear when not valid. Of course, I now have to find a nice SVG fast forward icon :slight_smile:

I updated to renpy 8.1 for SVG and oversampling support and grabbed a public domain fast forward svg.

I think it looks a bit jank

Although that could just be my zoom pulse animation numbers. That’s the bit about red. I know how to really nail the code on “turn red” whereas grow slightly to indicate you’re functional? It’s a bit more subjective.

1 Like

Yeah probably not super necessary! I would say from a user experience that the most important things are:

  1. Knowing when something is clickable versus not clickable (highlighting in red does that really well)

  2. If I want to do something, knowing what I would click to do that.

  3. If something is clickable, knowing roughly what that might do.

  4. Making sure users can’t accidentally click things to do the wrong thing (confirmation screens are really good at this)

Even with the highlighted time, I think you have made that pretty clear, though I would have to play the game to know for sure. I wouldn’t spend too much time thinking about the fast forward button if it isn’t coming easily.

Working on trying to make sprites not look awful, haven’t succeeded yet

Female NPCs can now examine a menu and decide what they’d like to order based on their preferences but not exclusively based on their preferences. This one tripped me up because of my lack of knowledge about python and propogation of mutable blah blah blahs.

This is done via some silly object orientated stuff, so the girls have preferences, outfits, weight, hunger, fullness meters… the menu has prices and food the food can check itself to see if it’s a plural noun or not… etc etc.

The variations on what can be said and when have dozens of quips written in, different girls can weight differently the likely outcomes of the quip system.

Narration that should have sound effects does. Most sound effects in the folder aren’t enabled yet (needs sorting.)

For debugging purposes I set up an infinite loop in the cafeteria, but in theory you actually need to go to the cafeteria when it’s open, and the femalenpc’s who would be there are based on their daily schedules. The UI for which is teased here Hi there, been posting for quite a while now. SexyFatGirlRenders - #96 by SexyFatGirlRenders

edit: a typo turned off sidehead’s

In scene action renders are not yet made, I have to choose their exact poses and expressions and render a large number of them, I’ve been too distracted working on code lately to get that step done.

TLDR: 1000s of lines of code 20 seconds of gameplay :stuck_out_tongue: AKA This is slower than I thought it would be.

2 Likes

@coding experts. I’ve just realized that the way I’ve coded my endless variation of responses system, which I’ve named quips results in gameplay such that, if you see a randomized response (which many of the above are) and you rollback and then try to re-read it, it’s gone, and a new random sentence is made and displayed instead…

Whereas in most renpy vn’s you rolling back and forth can’t change random rolls at all and you need to do like a quicksave quickload to get an alternate random result, hmm.

I’m not sure if my way is better or worse, or even fixable at all.

edit: Come to think of it, now that I’ve had to alter a few lines of code from

templist = importantlist

to

templist = importantlist.copy()

because of how python likes to make variables into references rather than separate entities…

That might explain why random.choice(list) is different from random.randint(0,x)

So, as a note mostly to myself, I should try converting some of my

dothing = renpy.random.choice(list)

into

tempint = renpy.random.randint(0,(len(list)-1))
dothing =list[tempint]

I don’t comprehend the theory behind this, so I might have it 100% wrong, but I could test it, and see if that makes rollback function as expected. hmm.

I haven’t looked into the implementation, but I suspect the renpy.random wrapper just saves the prng seed when it checkpoints (on say and menus amongst other places) and restores it when you roll back. Because it’s pseudo-random it will always generate the same sequence of results from a given seed (that’s how I’d have done it).

You can always run two prngs: one for important stuff (like who is where etc) and one for trivial stuff (like which phrase/adjectives/nouns you are using). Yaffaif does this: the one for combat and important stuff has its seed saved in the save game, the trivial one for text variations is allowed to free-run. But, I’m not sure how players familiar with Ren’Py default behaviour would react to this either.

Everything in Python is pass-by-reference: it’s just that some things are immutable (numbers, strings) so if you alter it you get a new object as a replacement (references now point to different objects), and others are mutable (class instances, collections - except tuples) so the changes are seen by all references.

I’m fairly sure the skip dialogue works on the string “id”: the ones you get if you ask for a translation, and not on the actual substituted text of the string (that happens when it is displayed if it’s Ren’Py interpolation) - not sure how it works for string.format or f-strings (those may all look “the same”?). Possibly different behaviour between these two (?!):

    beth "[builtStr]"
    $ beth(builtStr)

Also if your prices are floats the format specifier :.2f should always give 2 places of decimals for those cent values.

This specific restaurant is configured to rip people off.

        @property
        def ListOfSpecificFoodPricesStrings(self):
            templist = []
            for x in self.listoffooditems:
                templist.append('{:.2f}'.format(round((x.price * self.pricemultiplier),2)))
            return templist

But yeah, you’re right, I do not care AT ALL if the quips can be skipped or roll’d back or whatnot. But the following code needs to support rollback in order to not piss off players.

        @property
        def GetEventToTrigger(self):
            self.count = self.count + 1
            blahblahblah
                if len(self.listofnormalevents) > 0:
                    tempeventindex = probabilityforlistindex(len(self.listofnormalevents),0)
                    tempevent = self.listofnormalevents.pop(tempeventindex)
                    self.listofnormalevents.append(tempevent)
                    return tempevent
                else:
                    return None

Good news though! My event system DOES properly save prng and support rollback and rollforward.

So the stuff I coded myself somehow works like normal renpy, but using renpy.random.choice() doesn’t work like normal renpy. Quite confusing, but I guess it’s like you said, related to the wrapper somehow? (Although the one I coded myself is just renpy.random.gauss() so I’m not sure why…)

Well it’s like the code shows, like I implied… my event system doesn’t randomize a list of choices of events, it randomizes a number, that number is the index.

TLDR: I think you’re agreeing with my assumptions, but you’re explaining it correctly and I’m using all the wrong terms :slight_smile:

edit:

    def choiceofrandomquip(listofkeys,many=1):
        tempindex = renpy.random.randint(0,(len(listofkeys)-1))
        print("The number chosen for the quip type is"+str(tempindex))
        tempstring = randomquip(listofkeys[tempindex])
        return tempstring

This code supports rollback, so the only part of the quip system that does not support rollback is

return "{w} ".join([personalityweightedlistchoice(thesaurus[key],currentgirl.personalitymatrixnumber,False,False) for key in keys])

But again maybe this shouldn’t support rollback, because a player might want to intentionally rollback to see alternate sentences on purpose.