Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

brunoais

65
Posts
2
Topics
15
Followers
10
Following
A member registered Nov 13, 2016 · View creator page →

Creator of

Recent community posts

I received DM confirming it works. I'm releasing a new version

I've tried making changes so the inspect adapts to the GUI size.

The direct download link is here: https://gitlab.com/brunoais/renpy-guiInspect/-/raw/dist/renpy-guiInspectv0.3.1-pre.rpe

Let me know if this works for you. If the issue is solved for you, I'll release it as a new fix version.

Thank you for reporting

I have a couple of ideas but I don't know how comfortable you are editing an rpe, so I'll get you a probable solution soon. Give me just a small while to figure this out properly.

Either that or grab the previous function and store it locally while calling it, which is what I suggested and KigyoDev did

Sent an example as discord DM

(1 edit)

Export doesn't work.

I tried converting a .rpy file translation I have for one of my previous commissions and the file comes out with just a line as the header with the correct language set but and all the already translated and not translated yet strings aren't there. It's only the single header line.

By the way, I had to run it through Proton because this is a windows executable.

You're welcome. Glad it helped you. Did you have any issues using it?

Nice!

Go ahead, you can use the code I gave you for this.

Sounds good. 👍

There's some things I really would want to implement such as the concept of namespacing the variables, functions, transforms, etc... so it doesn't clash with other stuff. The rest, that's not as important.

I'm open for discussion or comments, if you want. You can contact me. I'm also on Discord and other discussion forums.

If you want some help with it, I'm open to try this too. Maybe we can come up some solution together.

Thank you for your time to answer and explain your situation.

For licensing, in my case I ended up with MPL 2.0. It's strict enough for my creation but loose enough to allow others to use it. Attribution enforced by the license is really something I'd like it to have. I could edit it but then it's a custom license that is untested and unproven (and couldn't be called MPL or any variation of that).

I'm open to cooperate and help making stuff that is useful for the community. Like these tools you spent a lot of time on. If I can help, I'm open to help. I want Ren'Py to succeed and I believe these tools help achieving just that.

If you ever feel like cooperating with something, I help with what I can. You can find me here or Discord or lemmasoft forums. I'm brunoais pretty much everywhere. See you soon 😉.

(1 edit)

Now that I remember... I think I've seen that function before. Is it this? https://github.com/ojii/imgsize

I remember seeing something like this when I was doing a library for image loading and handling (which is still not ready for public consumption) a couple years ago...

Nevermind. I get it now. The standalone script was fixed.

I don't know what get_size is. Did you mean to use renpy.image_size() instead? That's what I used so I could see the demo.

E.g.

Instead of:

v = renpy.Render(get_size(self.mask)[0], get_size(self.mask)[1])

I swapped it with:

v = renpy.Render(*renpy.image_size(self.mask))

(That way it only calculates the size once too)

However, this is a very slow function, so I think it would be productive if you cached it. I tried caching it and I got a significantly more responsive UI.

Other than that and some few more things... Overall, this is very well done. It's a keeper.

Part3:
I like what you are doing this and I want this to succeed. I want to see more of good mouth flaps. However, when I see the code provided. I see multiple points I feel I shouldn't just leave like that.

So, here's some thing I'd suggest. Maybe you can learn too, the same way this presentation had things for me to learn.

Oversampling

Ren'Py already comes with oversampling out-of-the-box. You only need to use the "@" in the file name and Ren'Py takes care of oversampling for you.
Manual: https://www.renpy.org/doc/html/displaying_images.html#oversampling

Namespacing

I'd like if this example also made use of namespacing. In this case, it involves making us of the "in" modifier for python init.

E.g.
Instead of:

init python:

do:

init python in flapsAndBlinks:


This avoids clashing with functions of other libraries or the VN maker's

Choice

When doing choice, reduce repetition. Make use of the simple expression whenever viable. Ren'Py caches these expressions.

E.g.

alpha 1
choice:
    closed_eyes
choice:
    closed_eyes
choice:
    closed_eyes
    pause 0.05
    alpha 0
    pause 0.2
    alpha 1
    closed_eyes
pause 0.05

->

alpha 1
closed_eyes
choice 2:
    pass
choice:
    pause 0.05
    alpha 0
    pause 0.2
    alpha 1
    closed_eyes
pause 0.05

-----

alpha 1
choice:
    pause  0.1
    mouth_open
    pause  0.1
    mouth_half_open
    repeat 3
choice:
    pause  0.1
    mouth_open
    pause  0.1
    mouth_half_open
    repeat 6

->

alpha 1
pause  0.1
mouth_open
pause  0.1
mouth_half_open
choice:
    repeat 3
choice:
    repeat 6

(code is hard to type in itch....)

WhileSpeaking is intelligently made

The way you do this is smart:

def WhileSpeaking(name, speaking_d, done_d=Null()):
 return DynamicDisplayable(curried_while_speaking(name, speaking_d, done_d))


Finally

Thank you for making this tutorial. I hope it's picked up by many people and this can be used by many more people.

(1 edit)

Part2:
When I read this VN's source code, specially the code used for the examples, it makes me want to 

Using a CCA license for software is weird. However, nowadays mature (and tried-and-true) software licenses do not enforce attribution. I know that feel and I just decided to accept that and hope for people's good faith.

Well done. I wish I could provide such through and complete usage manuals as this one with practical examples to boot.

I have a few separate things I'd like to comment related to this tool, so I'll create a separate comment for each of both.

For starters, It's well presented and it's well done. Quite visually interesting. I see quite some (intended or not) inspiration from Ren'Py's own tutorial. That makes it flow nicely. The links are also fairly welcome.

By the way, while checking this out I found a single typo:

Let us first look at how we put voice lines into our sript. This is important.

With all that text for a jam, typos are those things that appear out of nowhere, no matter how many times you read, you read it right until someone points it out and then it magically becomes wrong 🤣.

This has a lot to go well for it. It has a great base to work on but then it has quirks with its code design which I wish weren't there.

  1. I like how it's well done and how easy it is to set up. 
  2. I like how I could make it work with a VN I'm being commissioned to work on (although this won't be included with it... Maybe).
  3. Being able to choose what sounds are too much for me is such a great addition. I wish I could do this with the lighter horror games to remove insect sounds and remove the jumpscare sfx and out of tune music.

At the same time, I wish:

  1. It had a directory-based opt-in auto mode. It already has the code to auto-guess code generation, which is good. Now it would just need an auto-mode where everything is just done automatically through directory names.
  2. The use of before_main_menu while it must be unique is not pleasant. When I added this tool, the first thing that happened was it blowing up with an error that the label was already defined. It's true the manual warns about it but I wish that you'd listen to one of Ren'Py's callbacks instead and then made a custom screen that appears for a short amount of time.
  3. I wish you namespaced your transforms and styles. I had to rename drop_in because it was already in use elsewhere. Problem was that it was erroring on my own drop_in transform, which delayed by debugging on where this was.
  4. You namespaced your code. Your tool was also not behaving correctly when I first tried because I already had a function called stop_all_audio so, when your tool was trying to execute it, it was actually running my function stop_all_audio which was causing issues. That one wasn't fun to debug.

Good luck with this. Thank you for providing this to the community. Thank you for all the tooling and stuff you've been making over time for free.

This has a lot to go well for it. It has a great base to work on but then it has quirks with its code design which I wish weren't there.

  1. I like how it's well done and how easy it is to set up. 
  2. I like how I could make it work with a VN I'm being commissioned to work on (although this won't be included with it... Maybe).
  3. Being able to choose what sounds are too much for me is such a great addition. I wish I could do this with the lighter horror games to remove insect sounds and remove the jumpscare sfx and out of tune music.

At the same time, I wish:

  1. It had a directory-based opt-in auto mode. It already has the code to auto-guess code generation, which is good. Now it would just need an auto-mode where everything is just done automatically through directory names.
  2. The use of before_main_menu while it must be unique is not pleasant. When I added this tool, the first thing that happened was it blowing up with an error that the label was already defined. It's true the manual warns about it but I wish that you'd listen to one of Ren'Py's callbacks instead and then made a custom screen that appears for a short amount of time.
  3. I wish you namespaced your transforms and styles. I had to rename drop_in because it was already in use elsewhere. Problem was that it was erroring on my own drop_in transform, which delayed by debugging on where this was.
  4. You namespaced your code. Your tool was also not behaving correctly when I first tried because I already had a function called stop_all_audio so, when your tool was trying to execute it, it was actually running my function stop_all_audio which was causing issues. That one wasn't fun to debug.


Good luck with this. Thank you for providing this to the community. Thank you for all the tooling and stuff you've been making over time for free.

Oh wow! I post it and you immediately find it. I just woke up to find that there's already a message.

Thank you! Glad it was useful for you!

No idea what you mean.

Ur welcome

Because it's the closest nth zeroes to the number the game can reasonably store for a number.

It's best you don't mess with them. Export the saves instead.

That's an anti-virus problem. Check what it's doing. It's probably false-flagging some files.

That gives me an idea. I know a JAM that will come soon. Maybe I can do that for that JAM. I'll let you know when I have an initial version for you to check if it looks good.

True. I'll keep it as is now then. I will still implement the n when I have time to also test it works.

Let me see if I get it:
You would like to have a "take me to the source code of this" kind of addon for Renpy? You activate it, then click on the thing where you want to go the source code of and you end up there?

Ah yes. I think I get the idea. If you rotate that way, more like a piece of paper on the table, that would definitely happen. I checked the code about how would it be to implement that. It's not impossible but that one is a bit harder. The hardest part of that solution is the need to invert the levels. Basically, I'd need to figure out first what's the nth of the thing on top (the button in your example) so I can invert the subtraction.

More like 

maximum_level - level 

instead of just 

level 

. Quite feasible. Just takes some extra work.

(sorry. I answered outside the thread)

  1. Yeah. I'd say there's some inspiration from HTML+CSS when Tom did Ren'Py's code architecture for the UI. However, there's clear simplifications all around whenever it was feasible. This is one of them.
  2. I'm not sure what do you mean... Do you mean to have the reverse order for the list that appears? This is actually the same API that Ren'Py uses for the inspector Tool to work.
  3. Yeah. That's fine to implement at some point. N would only work after pressing M but I think that shouldn't be a problem.
  4. No problem.
  1. Yeah. I'd say there's some inspiration from HTML+CSS when Tom did Ren'Py's code architecture for the UI. However, there's clear simplifications all around whenever it was feasible. This is one of them.
  2. I'm not sure what do you mean... Do you mean to have the reverse order for the list that appears?
    This is actually the same API that Ren'Py uses for the inspector Tool to work.
  3. Yeah. That's fine to implement at some point. N would only work after pressing M but I think that shouldn't be a problem.
  4. No problem.

Sorry about the delay. itch.io was down.

Ok. I see that some of my design decisions are leading you to these questions. I'll address them one-by-one

The stack when selecting

When you start selecting something, the tool gets everything that is in the 2D plane of the mouse. In other words, regardless of what is on top of it, it gets everything that is part of that position on screen. That is done by Ren'Py's internal undocumented API.

Think like you have an A2 size table with lots of A4 sheets of paper. Then you get a knife and pierce through all sheets anywhere on the table. The ones the knife pierces through are the ones part of the stack obtained. That's basically what this does.

The background image (more exactly, Displayable) is just an image like any other, for Ren'Py. There's no way to distinguish. Also, if it's always covered, it would be impossible to select it without hacks or annoying processes. So I ended up going with this process.

It is both not trivial to know when the thing you selected ended and when the next thing starts. It is possible to have some tricks that usually work but not in the rare times which is usually when it's most frustrating.

Sorting of the stack

The way the stack is sorted is just a UX decision I did. It had to be sorted in some shape or form. I decided to go from bottom to top due to how the levels look like and are build, so it's increasingly "upwards" when looked at in the UI but also, first select the "closest" to the mouse. If you have a better idea, I can take it into account.

Going all the way when trying to select in the opposite way

When I need that, I usually just press Esc and then m again. However, rule of thumb with this tool is to edit 1 or 2 things at a time and then edit in the source code which makes it reload. However, in this case, it seems like what you want is to move the button and then the text, for example.
One thing I can consider is that if you move more than some small amount or some time passed, the next to be selected resets to the first one when you press, in this case, m again. Would that help? Or would having a button to go the opposite way help more? Using n while in move mode, perhaps?

Rough pos each time

You mention:

The tool helps me getting the rough pos each time

The tool is designed to get the exact position you want much more fast than with editing in your editor and reloading. Is it failing to do that for you?


Offtopic:
I read the Ice cream culprit. It was really good and funny! Keep up the work! I'm a fan now.

I've been commissioned to do other work. So next update won't be so soon. ETA unknown.

Some people came to know I did this tool and then came to me to do other work with Ren'Py. Whether that work will become publicly available is undecided still.

Just that.

(1 edit)

I got some ideas about improving the money. May I PM? Is Discord OK?

(2 edits)

Hum... This one is a very unexpected mixed bag.

SPOILER WARNING

I'll start with the bad because it's shorter.

  1. I miss some sort of Background music. Even if just a gentile piano song at some points.
  2. I miss some sort of backgrounds. At least, to give a mood of where they are. (but I don't miss ambient sfx)
  3. I miss being able to raise volume for voices. I had to boost my speakers to 130% because even at 100% (and the VN already comes with sound at 100% by default) I couldn't hear right.
  4. I miss some sort of credits at the end.

With the bad out of the way, here's the good

Alice is so so well done. The voice acting does an awesome job compensating for no BGM. Every VA did a really good job with their acting to portray each character with its own personality and individuality in a story written to allow them to shine through! However, Ciara (Alice) really stands out in how not-human-but-borderline-human she sounds. Regardless, everyone is so so believable. How were you able to find such a good roister of voice actors?!?!

Although no camera work, there's still some nice work put into the sprites that is almost as good as also having camera work. Good job!

I found it funny how everyone is completely oblivious about Alice's weird antics until someone actually touches her or she reveals it.

However, I really like that, if chosen a few of the correct options they tell Alice they like her although she's not human. Way better than so many stories where they go into "you're more human than humans" kind of stuff we are spoonfed by media. Anyway, they tell her she's loved regardless, due to how she is.

(By the way, I really would like if there was a way to get the vending machine taken care of by Alice. It should be fun.)

Alternatively, she tries to execute the alternative way to trying to become human, which is equally well executed and ends up in a well-written tragedy made very real by the voice actors.

The sprite acting is done right and feels a lot like a school play but without as much movement. Bring the actors to the scene. Play the actors and remove the actors from the scene. For that vibe it's done nicely.

Thank you for doing this VN. It was a great experience.

7 out of 10, I'd say.

(2 edits)

Praises

After going through the whole VN. I have to say I really like Pippa as a character and I jokingly hope I never meet her in my life. But I quite like how she is and how she interacts with the other characters.

I also like this OST so much. It really brings the mood up when there's no voice acting.

I also like how much the characters and the camera moves. This is a solo-dev writer and artist? Wow! Specially the dogs. So much done and I'd really guess not so many original images were used. I also liked the bird!

That librarian was morbidly funny, to me. Just the way she moves her book reminds me of those strict women featured in movies.

Extra

I have no idea what ATL you had issues with. It went fully smooth for me, except a single animation while on the street where she immediately straightens up in a snap.

The way that homeless just happened to have her book and MC was self-aware of how ridiculous that was really hilarious!

Faults

I really like the concept of the money+magic mechanic but I think it was quite underutilized. It's too easy to have money left and the punishment for doing wrong choices is quite limited. I feel like having tighter money would make it more interesting to the point to, for example, buying steak and giving money to the homeless guy, you only have enough to buy the energy bar near the end and cannot feed her in the intermediate meal.

There are some interesting plot holes I was able to get into... For example, with Mapo tofu and going cheap, I could get high 30's $ left and MC still talks about lack of money.

Ending 2 is interesting because if it was longer, it could evolve into Ending 3 after MC receives his salary no? Or am I seeing something wrong? (I like it, regardless)


That's what staid on my mind after reading. I liked it a lot. Thank you for making this! It made me a very fun morning.

This is a 8.5 out of 10 to me.

You sound like a great person. Here's an offer: If you want, I can give you some examples with some of your work.

For now, you can find me on discord under the same username. You can DM me and I can give some practical help 😉.

Oh... I see... Lack of experience drove those cinematography issues. I thought with so many programmers, you'd be helping each other on that 🙂. Maybe I just overestimated, sorry. Check out https://feniksdev.com/. he has awesome tutorials. There's also lots of youtube videos.

I think I get it... In that case, I think that part of the story suffers HUGELY (and I mean "hugely") from "good intentions, bad execution". You are trying to show that Oto-hime is gaslighting all the time but, in reality, what comes across is that she's right all the time.
There's no content showing the truth. There's no "before" in the story. There's only a hint about shaved ice with Shimako's own rejection. You can only continue fishing or go to your colleagues.... Both are just "go to turtle" without anything else. Then, the first time the reader knows about Shimako's past with her co-workers is about them treating her very badly.
At that time, Oto-hime didn't have any real opportunity to gaslight Shimako into really thinking badly about her co-workers. But, just in the first scene with Oto-hime, I already go through a meaningless choice "move" and a meaningless choice "Why did you bring me here?". That already sets the tone for how choices work and will feel to the reader. Then when choosing what to eat being fully meaningless, cemented that tone. Even if you wanted to make it look like it's a "you don't have a choice because you are being gaslighted", you taught something else to the reader.

Was I able to explain it better from the POV of the reader? 🤔

IMO, this could gain A LOT from:

  1. If the co-workers are actually good to Shimako, show an intro showcasing just that. 
    1. Maybe start with her having fun with her co-workers.
    2. Maybe also include a still image of the stairs and Kanede event.
  2. Make Shimako a little bit smarter. I know she has to stay an emotional pushover for the story to work this short but make her intent to do more.
  3. Rework the menus/choices. Start more meaningful and make them more and more meaningless over time.

Also, I think this would be a good idea.

  1. Make Shimako more distrusting of Oto-hime's advances in the very beginning (she was kidnapped, ffs!). But make Shimako gain trust faster, given how well she's been treated, instead of always in denial and always self-deprecating herself.
  2. Don't make Shimako think that the fish are swimming on land... Please... Instead, for example, "Why are fish swimming around me?" or something of sort would help Shimako sound much less dumb (there's more but that one specially staid in my mind)

Thank you for your attention.

(1 edit)

I just finished reading this and I have lots to say:

Spoiler alert

Great

Oto-hime is well done. It's a well-done, very tame yandere. She's well portrayed and the voice-actor, most of the time, did an excellent job in showing the soft-spokenness of her in contrast with her actions (when it was not excellent, it was good). I like a lot how the fact she's yandere appears over time and how it's revealed, with hints since very early.

OK

The co-workers were portrayed as fake bastards which allowed an interesting back and forth between wether Shimako was actually telling the truth or not.
They were also a good tool to enhance and diverse Oto-hime's personality.
The ending fits well for the buildup that the story has been bringing.

The bubbles are a nice touch.

Art style is incoherent. BG art, sprite art and CG art are disjoint and, from my perspective, it's as if the artists didn't do any communication to make it more cohesive. It doesn't stand out a lot but specially Oto-hime's detail level vs BG detail level does stand out.

Too bad that the coworkers didn't get to have complete sprites besides a silhouette.

NOPE

Shimako is, in my perspective, quite, with lack of better word, stupid. The actions, the options available, the thought process... If it wasn't for how interesting Oto-hime is and how cutely she's drawn, I think Shimako is really someone I'd avoid because of how much of a non-person she is. Countless times I felt like screaming to the screen for an option that would make sense... But it doesn't exist... After some time, it makes full sense it doesn't exist because it wouldn't make sense to Shimako's personality.

So so many actions narrated and not coded. Camera movements that could have been done, character movements that were not done, a couple more expressions for Oto-hime (is it because of lack of time? I understand if it is... Art takes time). I remember near the end, Shimako runs away but instead of zooming the camera out, Oto-hime is zoomed out. Also near the end, when Shimako is pushed in by the water, Oto-hime is zoomed in, instead of the camera zooming in.

WTF

So many menus asking for a choice. So many not-a-choice. So many seems to be a choice but it's not. It doesn't feel like a design choice. It feels more like to make the kinetic novel not feel like a kinetic novel when only a technicality at two points in the whole text makes it not a kinetic novel.

Overall

I reached the end and, I confess, it didn't really satisfy me. Even though, there are some parts that satisfied me, specially Oto-hime's portraial. Shimako... not really.

5 out of 10

The lib is fixed now

(1 edit)

Maybe the image is something that Unity shows as some sort of placeholder while trying to make the video show 🤔? My PC isn't potato slow, though.

No idea why it isn't OK then. I wonder which codec it is. VP9 would be the most universally working nowadays.

Then I sincerely wonder what consumes CPU so much. Since then I tried to limit my CPU but the framerate doesn't change. It stays at 60fps. I wish I could tell what it's trying to do to cause that but I don't know Unity.

I liked Dondon's video too. The story makes way more sense with the videos. No doubt. It's a nice drama I liked. I rated accordingly. I'd say a 8 out of 10. An amazing work for a first release. There are some parts that don't flow so well due to lack of visuals but that's more of my subjective view.

Ah! Makes perfect sense then. I'd have done the same myself. Learning Python and learning Renpy when you already know C# and the Unity platform is backwards thinking. Thank you for sharing that.


Thank you very much for the insightful explanation.

It's ok. I get it better now. It was looking so out of place, makes more sense now. Still, I wonder what that image is from. Is it just a Unity placeholder for a missing or unplayable video? What's the video codec (h264, VP8, h265, VP9, AV1, ...)? I couldn't find the video files themselves. Could it be it requires the codec in the host system and I'm missing the codec🤔?

On second thought about performance. I wonder if you are just using a busy (or eager) event wait loop instead of an event-based loop (for most situations, the event-based is much more efficient)🤔. That would mean the build isn't heavy, it just wastes GPU and CPU cycles 

Just let me know when you update. I'll take a look again then.

Closing and reopening didn't work for me, unfortunately.

For now, I'll look for a video on youtube with it. I saw that DonDon did a comment, I'll hope he also did a video.

Don't fret too much about it 🙂. It has significant issues related to these stuff but I think this is a really well done attempt for a first try 👍.

Just makes me wonder why Unity and not Ren'Py or LightVN. May I know?