Ren'Py Ren'py 7.4.0 released

No-Name

New Member
Mar 23, 2018
8
1
Ren'Py 7.4.0 released. I'm not a dev, but a macOS user, so what I'm the most hyped for is the universal build process. Devs no longer need to make multiple builds, a single build will support Windows, macOS, Linux, Android and iOS. This means we will get access to all games made with the new version.

What else do you think can come from this update, any significant features? Will Live2D bring anything good?

 

anne O'nymous

I'm not grumpy, I'm just coded that way.
Modder
Donor
Respected User
Jun 10, 2017
10,979
16,236
Ren'Py 7.4.0 released. I'm not a dev, but a macOS user, so what I'm the most hyped for is the universal build process. Devs no longer need to make multiple builds, a single build will support Windows, macOS, Linux, Android and iOS. This means we will get access to all games made with the new version.
No, it's not that. The universal build process concern Ren'py itself, not the games. It's just impossible to make a "fit them all" build for a game because the iOS and Android ones aren't pure native Python. But anyway, it's been years now that it's possible to have a Windows/Linux/MacOS X common built ; it's just that devs rarely do it.


Will Live2D bring anything good?
Not much, and probably less than what the layered images have bring.
I mean, it's already possible to animate 2D sprites in the Flash puppets way ; just apply the right transform to each part and it's done. Yet really few people do it. So, yes Live2D permit to do this with a better result and probably a little more easily, but for this you need to buy the software and a license that let you distribute it.
If few devs thought about animating their 2D sprites when it was possible for free, I doubt that many more will think about it now that they have to pay for that.
 
  • Like
Reactions: Rich

Rich

Old Fart
Modder
Donor
Respected User
Game Developer
Jun 25, 2017
2,566
7,384
Not much, and probably less than what the layered images have bring.
I mean, it's already possible to animate 2D sprites in the Flash puppets way ; just apply the right transform to each part and it's done. Yet really few people do it. So, yes Live2D permit to do this with a better result and probably a little more easily, but for this you need to buy the software and a license that let you distribute it.
If few devs thought about animating their 2D sprites when it was possible for free, I doubt that many more will think about it now that they have to pay for that.
It's worth noting that (if I'm reading the correct page), the Live2D license costs for "small-scale enterprises" (annual sales less than 10 million yen) appear to be free, although you still need to get a license from them. That being said, integrating Live2D is complex, so whether people will leap at that remain to be seen. Still, if you really wanted that feature, I have the feeling that some parts of Live2D would be easier than "rolling your own." But, as you say, I've seen very few games that take this approach at all, so it may be the "if you want it" that's lacking. (Pusooy did a LOT of this in Flash, of course. That was a main feature of his games.)

There are a number of features in 7.4 that hard-core programmers will probably find uses for. The renderer is more flexible, and more "bells and whistles" have been exposed to the programmer. Ren'py is also moving toward Python 3 support. But, in many respects, 7.4 feels to me like a "transitional" release - it provides a lot of new foundation and "steps in the right direction," but isn't "there" yet. That's not to discount the amount of work that went into it - there's a tremendous amount of "under the hood" coding that went into this.
 

anne O'nymous

I'm not grumpy, I'm just coded that way.
Modder
Donor
Respected User
Jun 10, 2017
10,979
16,236
It's worth noting that (if I'm reading the correct page),
You probably read it better than me, I mostly stuck to the big lines.


But, as you say, I've seen very few games that take this approach at all, so it may be the "if you want it" that's lacking. (Pusooy did a LOT of this in Flash, of course. That was a main feature of his games.)
It was, and globally still is, frequent in Flash, but mostly because the language was intended for this ; put a lot of small 2D images, then move them like vectors. But those Flash games generally used basic 2D images, what isn't necessarily the case for Ren'py games.
Without thinking about those using 3D renders, it's more difficult to turn into puppets graphics like those in Summertime Saga or Lust and Power. Not impossible, but not as easy if you want a smooth and good looking result. And the question is to know if the time you'll need for that worth what it will add to the game. As for games using 3D renders, it's clear, the result will be horrible most of the time.

As for the rest, animate part of the decors by example, Ren'py is already able to do it, and do it smoothly.
You don't have permission to view the spoiler content. Log in or register now.

Except for the raster that is something particular, all you need to do this is a two lines transform. The video should have been took when the transform was something like :
Code:
transform rotation:
    rotate_pad True
    linear 2.0 rotate 270
    linear 2.0 rotate -270
Add some works for the positioning if needed, and you've interesting effect without the need for a third party software.
What doesn't mean that it's a bad idea, just that for this scene it have few use.


But, in many respects, 7.4 feels to me like a "transitional" release - it provides a lot of new foundation and "steps in the right direction," but isn't "there" yet.
I agree. Ren'py is actually maturing into its future state, with PyTom using the fact that he have to rewrite part of the code, and will be forced to drop a part of the backward compatibility, to add many things. The most impressive one being probably that he just opened the gate for realtime 3D. It's still something to do, and it will be limited in regard of what more professional engines can do, but it's a big step ahead.


That's not to discount the amount of work that went into it - there's a tremendous amount of "under the hood" coding that went into this.
If I remember correctly, PyTom once tweeted that there were more commit for the 7.4.0 than there were for the whole project during the X (it's the part I don't remember at all) last years.
 

Rich

Old Fart
Modder
Donor
Respected User
Game Developer
Jun 25, 2017
2,566
7,384
Without thinking about those using 3D renders, it's more difficult to turn into puppets graphics like those in Summertime Saga or Lust and Power. Not impossible, but not as easy if you want a smooth and good looking result. And the question is to know if the time you'll need for that worth what it will add to the game. As for games using 3D renders, it's clear, the result will be horrible most of the time.
Yes - that was what the Pusooy games involved. He'd clearly done 3D renders, but then mastered the art of cutting them into pieces (the hard part being the joints, of course) and then animating them like puppets. His games had a lot of "you have to move the mouse back and forth, which moves the characters back and forth, and you have to do it N times before I'll let you move to the next frame" mechanics. Some of which were effective, some of which were.... tedious.

As for the rest, animate part of the decors by example, Ren'py is already able to do it, and do it smoothly.
Yes - absolutely. For that kind of thing, Ren'py's


I agree. Ren'py is actually maturing into its future state, with PyTom using the fact that he have to rewrite part of the code, and will be forced to drop a part of the backward compatibility, to add many things. The most impressive one being probably that he just opened the gate for realtime 3D. It's still something to do, and it will be limited in regard of what more professional engines can do, but it's a big step ahead.
Ya, that's kind of what I was talking about in terms of "things hardcore programmers can use." Providing a more "front and center" OpenGL implementation that can be accessed from Python may make very interesting changes in Ren'py-based games (not just adult ones) going forward.

If I remember correctly, PyTom once tweeted that there were more commit for the 7.4.0 than there were for the whole project during the X (it's the part I don't remember at all) last years.
Quite. For the past few years, it's been mostly small editions and bug fixes with each release. (Well, "small" in the grand scheme of things - not discounting the value and power of things like LayeredImages, etc.) This, on the other hand, was a massive rewrite, both because of the additional features, but also because of the beginning of the Python 3 migration. The latter required non-trivial changes on a LOT of "foundation code" that's been in Ren'py (more or less untouched) for years and years.

Just for the benefit of the people that may not be aware of this, one of the big reasons Python 2 and Python 3 split in 2008 was because Python 2 was created well before Unicode support was a "thing." (Not that Unicode didn't exist, but most people just didn't worry about international support back when Guido first invented Python - it was an "ASCII world.") (There were other reasons as well, but that's one of the big ones.) So, Python 2 treated strings as sequences of 8-bit characters, which obviously won't cut it in the modern "all those languages" days. Later on, "unicode" objects (i.e. "strings" made of unicode characters) were added, but the big issue was that lots and LOTS of Python 2 code also used strings as arbitrary containers of 8-bit bytes, not just sequences of text characters. So, if you read a binary file, you got back a string object, and you had to do a lot of mental bookkeeping to deal with "is this a text string or is this a binary buffer" throughout your code. This mixing of "strings as binary" and "strings as text" made for all kinds of problems when the migration toward "proper" Unicode support happened, and greatly complicated a lot of issues with I/O. Eventually, it was decided that this, along with a lot of other odds and ends, had to be fixed. Basically, "let's clean up our language and our core packages." Rather than breaking huge amounts of existing Python 2 code, they essentially forked Python 3 out of Python 2, and then made the wholescale underlying changes to "get it right" (or "more right") just in Python 3. In Python 3, a string is always text - it always contains Unicode characters, not raw binary, and a new "bytes" object type was introduced to handle arbitrary binary data. The two aren't interchangeable, although one can be converted to the other and vice versa. So now reading a binary file returns a "bytes" object unless you explicitly ask for the raw bytes in the file to be converted to text, which is done by different methods. There were lots of other cleanups as well, of course. (One of them being the behavior of division, which is the one most likely to bite people in the butt.) But, in many respects, you have to think of them as two very similar but not-quite-compatible languages.

Python 2 and Python 3 essentially evolved in parallel for many years - lots of new "3" features were back-ported into "2", and "cross-compatibility" techniques were introduced so that people could write libraries that would work with both Python 2 and Python 3. (This is where Python's lack of "strong typing" was a great benefit - you could write code that would say, "well if this is running inside a Python 2, I can use create "unicode" object, but if it's Python 3, I can create a "str" object, then go use them.)

Eventually, however, it was decided that no new features would be added to Python 2, so Python 2.7 was the last major release of it. In 2014, "they" announced that Python 2 would stop being supported as of 2020. That doesn't mean that Python 2 "blew up" at that point, just that no more updates would be done to it. Which, in turn, means that many of the packages "out there" would drop support for Python 2, or that packages specifically written for Python 2 would stop getting updates. So, somewhere in 2019 (I think) PyTom bit the bullet and started work toward migrating Ren'py toward Python 3.

Since he's as committed to backward compatibility as the Python people were, when full Python 3 support does come out, it's going to come out in parallel with continued support for Ren'py using Python 2. So, for a while, there are going to be two parallel Ren'py's as well. But, eventually, developers are likely to wean themselves off Ren'py-Python-2 and over onto Ren'py-Python-3. Version 7.4 is the first step in that direction - it still uses Python 2 under the hood, but it has a new compatibility mode that allows you to begin writing code in "compatible with both 2 and 3" manners so that people that do serious Python in their Ren'py can prepare for Ren'py 8.0 and Python 3.

I mentioned division earlier. In Python 2, if you divided two integers, you got an integer, with fractions thrown away. So, in Python 2, "5/2" gave you "2" - the result truncated to an integer. If you wanted 2.5, you had to convert one or both to floating point numbers first. ("float(5)/2"). On the other hand, if you divided floats, you got a float with the fraction. So 5.0/2.0 didn't give you the same result as 5/2. Not a big deal when you're using explicit numbers, but when you start using variables, what does "a/b" give you? It depended on the exact types of "a" and "b".

In Python 3, all uses of "/" give you a floating point result. If you want the old behavior (i.e. "throw away the fraction") you can either do "int(a/b)" or "a//b". The new "//" operator has the semantics of the old "/", but behaves consistently with either integers or floats. So "5.0//2.0" gives you "2.0" - the fraction is discarded, even though both are floats. So, an inconsistency that had plagued programmers for years was cleaned up. (This is one of those "other things" that they fixed when going to 3.)

So, ya - no surprise that this was one of the biggest Ren'py releases ever. The amount of "framework code" that had to be updated was probably huge. (Think about all the code involved in parsing .rpy, .rpyc and image files - all that probably required tweaks to deal with the "str vs bytes" issue. Even with "works on 2 and 3" compatibility libraries, it HAD to be a ton of work. PyTom credits 35 developers in addition to himself as having helped bring out 7.4.)
 

anne O'nymous

I'm not grumpy, I'm just coded that way.
Modder
Donor
Respected User
Jun 10, 2017
10,979
16,236
I mentioned division earlier. In Python 2, if you divided two integers, [...]
In Python 3, all uses of "/" give you a floating point result. [...]
For the readers, think about what the consequences of this simple change in division imply for a software that have to deal with image manipulation, and that have a screen positioning system that massively rely on percentage.
It don't break everything, but everything have to be controlled and validated again, in order to ensure that it will not assume an integer as result.


(Think about all the code involved in parsing .rpy, .rpyc and image files - all that probably required tweaks to deal with the "str vs bytes" issue.
Not this much, Ren'py already deal with unicode only for the rpy files, that are opened as text. It need to be validated, but normally this part should still works fine ; the isinstance will have to be changed, but normally it's all. But the rpyc, and also rpa, files will need to be correct since they open the file as binary, but validate the signature through a text string comparison. The validation of the format will have to be corrected.


Even with "works on 2 and 3" compatibility libraries, it HAD to be a ton of work. PyTom credits 35 developers in addition to himself as having helped bring out 7.4.)
Yeah, and a work that isn't finished... and that I'll have to do myself for my tools and mods :(