|
Post by Somasam on Mar 17, 2016 21:16:09 GMT -8
I am making this thread to ask both the community and the devs: what game engines could or will Love in Space use to make their next game.
For their past games, LiS have used Renpy; a well known and pretty competent visual novel engine that many VNs have used in the past, including games such as the amazing Katawa Shoujo and the Shovel-ware Sakura games.
Of course, Renpy was only really designed to be used for making visual novels. Not highly detailed tactical turn based strategies. While I don't remember the exact quote, I do remember Samu stating that there was a huge amount of time and manpower put into the development of Liberation Day solely for getting the combat to work right and play well. (For the record, the combat is amazing and works really well. Its fun, clean, and not nearly as laggy as Mask of Arcadius's combat was.) This implies that there might be a change to a different engine to better accommodate the combat system, make the transfer of decisions from one game to another more feasible, and help make modding even easier for the community.
So now I am curious. I do not really frequently play VNs, the first one I played could arguably be "RPG Shooter: Starwish", while the first fully recognized VN I played was Katawa Shoujo. The Sunrider series is one of my only experiences with the genre, so I am not fully aware of what kinds of software other authors use to make their novels a realty. I would like to know what other possible engines the LiS team could use to create more great stories and combat scenarios; Either ones traditionally used for VNs, or ones that could be used to better implement the combat.
If the devs have already come to a decision on which engine they are going to use, I would greatly appreciate knowing which you guys will be going with. Or perhaps if you decide to create your own brand new engine from scratch just for your own games.
|
|
|
Post by vaendryl on Mar 17, 2016 21:48:34 GMT -8
if we're switching engines it'll likely either end up being unity or gamemaker. making an engine from scratch is absolutely not in the cards.
Most current issues (mostly lag) are caused by poor coding decisions made 2 years ago. If I rewrote half current code I'd certainly solve or improve most of it. It'll also get much more complicated. No matter what it's still cramming a dodecahedron into a triangle-shaped hole, though. It'll take a much better man than I to get an RTS running in python :/
Switching engines may be asking for far more problems than get solved. Renpy is great for VN segments, but not made with much support for gameplay. Other engines are great at gameplay but suck at VN things. we'll have to see to be sure.
|
|
|
Post by admiralcheese on Mar 17, 2016 22:28:15 GMT -8
Honestly I kind of hope you guys keep Renpy. It's far from perfect but it is familiar and you're pretty damn effective with it. That said I know next to nothing about coding so I might be completely off base.
|
|
|
Post by Nemjen on Mar 17, 2016 23:03:28 GMT -8
The main problem people seem to have with Ren'py is the performance aspect during combat scenarios, granted this engine was not made for such things but as both solutions (new engine / rewrite code for Ren'py) are resource heavy one would need to be pursued in the long term - at least a bonus is that when it is done it can be re used in future games.
Either way while it hasn't affected me too much performance should really be on the cards this time around.
|
|
|
Post by Marx-93 on Mar 17, 2016 23:51:50 GMT -8
The Doddler has more or less managed to perfect the art of making Unity ports of VNs (he's making it work for Grisaia right now, and even posting technical bits on his twitter), so I thought you planned to do something similar for Sunrider: "porting" the VN parts (that aren't that complicated from the beginning) and making use of Unity's to make a good turn based system.
Ren'py's main problem is that it's so commonplace and easy to use that now is commonly associated with poorly done shovelware (specially if you use its default U.I.). One of its greatest features, the rollback (that substitutes a normal log) already worked kinda wonky before 2.0 due to having the R&D part crammed in, and it has always worked not too well with voices.
And really, we're in 2016 to have a VN with full voice acting but lacking a proper log and voice repeat features... That's the VN equivalent of limiting to only one save archive in an JRPG, really.
So I honestly think even the VN part is a little bit lacking in Ren'py in my eyes. Maybe putting some work could improve things, but honestly that work could also be put on a new engine.
|
|
|
Post by Nemjen on Mar 18, 2016 0:13:06 GMT -8
Good point on the log, making it a separate entity would also prevent that issue of using roll back causing upgrade decisions to be undone.
|
|
|
Post by Samu-kun on Mar 18, 2016 1:02:52 GMT -8
Game Maker's more or less out because the license says no 18+ games can be made on it and GM's owners can effectively bar any game from being released on it based on what they feel like. So it's not a viable solution.
Unity will only make our problems worse because we'd have to start from scratch on an engine multiple orders of magnitude more complex than renpy.
The engine's not really the biggest issue anyways. Maybe the TRPG segments took about half of the development time of the game. It's not really the engine which causes the huge development hours. Balancing, creating assets, and debugging a TRPG takes months of work on pretty much any game engine. Basically, we spent I think about 5 months making TRPG segments which a substantial portion of the player base chose to skip. I think the VN segments could easily have been 4 to 8 times longer had those 5 months not been used to make the battles. But I guess I don't really know for sure, it's just all guess work.
|
|
|
Post by KnightOfXentar on Mar 19, 2016 3:27:06 GMT -8
we get it, it's not that hard to code in Ren'py, but unfortunately its performance during combat is bad. Core i3 as minimal requirement for Ren'py is unusual. And even if you have more powerful CPU you still can get lags during bigger fights, that's not a good sign (like mission 9, if I remember correctly)
If you could simply fix its performance issues during fights with just some coding, it would be nice.
Well, in the end you are the one who can see how complex the coding is, so ultimately it's your decision whether to stick with Ren'py or try Unity.
|
|
|
Post by Xechran on Mar 20, 2016 23:39:14 GMT -8
If its performance you're worried about, this thread made a world of difference for me. Completed a play through with the framerate, cache, and free_memory code added. Much more smooth and no crashes that I recall.
|
|
|
Post by limith on Jul 13, 2016 20:47:16 GMT -8
You could theoretically make one in electron.js/javascript. hexagon.js' source code is a pretty good guide to making a hexgrid. The battle engine can be a separate canvas object (impact.js, easel.js, or phaser.js) which you can initialize from the VN part with various arguments. You can use json objects stored into localstore for saving or a library that auto serialize/deserialize classes for you similar to pickle. Not sure yet about what library to use for the VN part. Novelsphere.js is proprietary, js-vine looks really stripped down (but supposedly is based off ren'py), and belle looks like an editor.
Shop/ship/UI wise, vue.js is pretty much tailor made for the task.
I plan on playing around with this when I can (mostly to learn vue.js). Working on a backend for a friend's pokemon related app right now though.
Regarding The Doodler converting VNs to Unity, I second Marx-93's comment. Another option is Degica's VN Maker if it turns out to be good. Supposedly the engine is based off of a generic game engine so it should in theory support editing the code to add a TRPG engine.
|
|
|
Post by kielomo on Jul 14, 2016 1:02:35 GMT -8
I just played on ultra easy. Combat lag with OP God Kayto powers. No need to worry about lag if all the enemies are dead before the first attack, lol.
Yea, new engine would be nice, however, even if you continue to use the current game, it won't stop me from buying the game, and enjoying the hell out of it, lag and all.
|
|
|
Post by vaendryl on Jul 14, 2016 6:36:10 GMT -8
I made a completely new combat framework that allows for over 400 animating (like a .gif file) sprites on screen at once (moving around) on a 40 by 40 isometric map - without noticeable lag. in renpy. (can't get the game to save currently though ) all the lag in sunrider is 100% because I never had any clue wtf I was doing and is entirely preventable if coded properly. as mentioned before though, rebuilding the entire combat framework as used by sunrider this way would be a massive undertaking and is bound to introduce enough bugs to keep testers occupied for half a year. now if only I can get the damn game to save.
|
|
|
Post by Xechran on Jul 14, 2016 8:35:33 GMT -8
Every time someone brings up lag I have to ask the same question:
This is a quick and easy fix that alleviates most of the problem for... well... everyone whose gotten back to me on it at least.
|
|
|
Post by bigfoot on Jul 15, 2016 4:34:54 GMT -8
I made a completely new combat framework that allows for over 400 animating (like a .gif file) sprites on screen at once (moving around) on a 40 by 40 isometric map - without noticeable lag. in renpy. (can't get the game to save currently though ) all the lag in sunrider is 100% because I never had any clue wtf I was doing and is entirely preventable if coded properly. as mentioned before though, rebuilding the entire combat framework as used by sunrider this way would be a massive undertaking and is bound to introduce enough bugs to keep testers occupied for half a year. now if only I can get the damn game to save. That sounds fantastic! Today started reworking for multiple factions in a battle (5-6, each with their own allied/enemy/neutral factions) but was wondering how well renpy would cope with it. Would also make implementing command auras and background effects much better because they lagged MoA when I put them in. Will the map size be flexible at all? Thats something I wanted to do but kept running into lag issues.
|
|
|
Post by vaendryl on Jul 15, 2016 5:47:07 GMT -8
yeah, the map size is easily adapted to whatever isometric background is preferred. I'm treating the tilesizes as constants too, but those could be dynamic too of course. animation works via sprite sheets. I also got my feet wet with proper pathfinding, so all around it's been an interesting project.
something I'm especially stoked about it the ability for the player to give commands to a unit while the previous unit is still carrying its orders out. few (turn based) games allow that but it results in some real nicely flowing gameplay and really wish I could make all this work for Sunrider someday.
|
|
|
Post by Dextix on Jul 15, 2016 7:21:27 GMT -8
Damn Vaen, you have been busy.
|
|
|
Post by Nemjen on Jul 15, 2016 9:27:15 GMT -8
Corr it would be great if we could see a tech demo somewhere down the line especially if you get the thumbs up to implement it into Sunrider. (Hype, hype hype). Every time someone brings up lag I have to ask the same question: This is a quick and easy fix that alleviates most of the problem for... well... everyone whose gotten back to me on it at least. The fact optimising options like this exists gives people the option to use it if they want to experiment the effects on their system - which is always a bonus.
|
|
|
Post by limith on Jul 16, 2016 21:07:07 GMT -8
I made a completely new combat framework that allows for over 400 animating (like a .gif file) sprites on screen at once (moving around) on a 40 by 40 isometric map - without noticeable lag. in renpy. (can't get the game to save currently though ) all the lag in sunrider is 100% because I never had any clue wtf I was doing and is entirely preventable if coded properly. as mentioned before though, rebuilding the entire combat framework as used by sunrider this way would be a massive undertaking and is bound to introduce enough bugs to keep testers occupied for half a year. now if only I can get the damn game to save. If it is using python pickle, you should switch to json or python's ast since pickle has all kinds of problems. (Or during import use a utility function that tries to load via json then if fails tries to load using ast) Otherwise it's probably a serialization problem. You can write a DFS function to convert the dictionary prior to saving, or write a general function to dump to json and back.
|
|
|
Post by vaendryl on Jul 17, 2016 0:05:10 GMT -8
If it is using python pickle, you should switch to json or python's ast since pickle has all kinds of problems. (Or during import use a utility function that tries to load via json then if fails tries to load using ast) Otherwise it's probably a serialization problem. You can write a DFS function to convert the dictionary prior to saving, or write a general function to dump to json and back. Thanks for the suggestion, but it ended up being a problem with me forgetting a return statement under a 'after_load' label like a complete boob. renpy uses cpickle btw, and seems to work well enough. switching out such an ingrained part of renpy on my own though seems unrealistic and uneconomical. I'd sooner change my data structures to support it better than the other way around.
|
|
jack
Corporal
Posts: 52
|
Post by jack on Jul 17, 2016 14:03:50 GMT -8
If it is using python pickle, you should switch to json or python's ast since pickle has all kinds of problems. (Or during import use a utility function that tries to load via json then if fails tries to load using ast) Otherwise it's probably a serialization problem. You can write a DFS function to convert the dictionary prior to saving, or write a general function to dump to json and back. Thanks for the suggestion, but it ended up being a problem with me forgetting a return statement under a 'after_load' label like a complete boob. renpy uses cpickle btw, and seems to work well enough. switching out such an ingrained part of renpy on my own though seems unrealistic and uneconomical. I'd sooner change my data structures to support it better than the other way around. It's the little thins that always trip you up. I seem to forget brackets and quotes about 70% of the time, leaving a mess for debugging.
|
|
|
Post by Somasam on Aug 8, 2016 19:04:51 GMT -8
Huh. I am glad to hear that the majority of performance issues are all just self imposed from inexperience.
I can imagine that in Starnova, there will not be nearly as many coding hurdles for you to go through compared to a more game-play heavy experience such as Sunrider. Does this mean that perhaps in slower points in Starnova's development, where Samu will be doing more work on non-coding parts, you would be able to go back and work on Sunrider's combat coding?
And if you do, would you rather simply clean up the current code you have in place, or try to rewrite large portions of it from scratch? From the way you've described it, it seems like much of it is rubbish, and based on the new things you might want to implement; it would be easier to rewrite the code to accommodate what you want rather than forcing the older code to do such.
Commanding while other units are simultaneously following orders sounds like a really awesome idea, definitely keep the battle flowing.
|
|
|
Post by Azure on Aug 13, 2016 9:14:02 GMT -8
If there's anything Ren'py taught me, it's that large projects written in a dynamically typed language are a PITA to debug. For those interested, there's a story telling framework available for Unity called Fungus. I'm not suggesting that this makes porting to Unity viable in any way. Just thought I would throw it out there. That framework sounds awesome vaendryl. How'd you do it, if you don't mind me asking.
|
|
|
Post by vaendryl on Aug 19, 2016 7:10:07 GMT -8
That framework sounds awesome vaendryl. How'd you do it, if you don't mind me asking. I'll send you a PM rather than spam the board with technical stuff few care about
|
|
|
Post by Somasam on Sept 4, 2016 14:35:57 GMT -8
Hell, by all means put it up on here. Even in lame man's terms could be an interesting thing to read.
|
|
|
Post by vaendryl on Sept 4, 2016 15:39:20 GMT -8
allright. laymans terms. as much as is possible In Sunrider, the battle map and all units and events on it are all shown through ren'py " screens". this is a ren'py built-in mechanic that is intended to allow non-programmers to easily create menus and other UI elements. This system is very flexible, but never really intended for more than showing an in-game store, or an inventory or at the very most a dress-up game. forcing it to show countless elements within a large scrollable viewport was insanity in hindsight, and god-awful slow. What I've made since then is a system that doesn't use ren'py screens at all and instead is pretty close to pure python, or rather pygame (the library ren'py is based on). renpy offers a spritemanager framework that supports this, and actually is intended for more advanced gameplay. Doing this is of course a lot more complicated as far as coding is concerned, and I really didn't feel up to the task when I first started out. At the core I make a large background image into a sprite and create an update function that every frame (about every 0.02 seconds) checks whether the player is holding down the mouse button and if this is true, whether and how much the mouse has moved. this information is then used to change the location of the background sprite. Then, any other sprites (like units or doodads) get their screen position changed as well so they stick to the background. This per-frame approach allows for much finer control over what is happening on-screen. When a unit is clicked on I generate new sprites which show its movement range and I then record what tile the player wants to move to. I create a path in memory and set a flag that tells the game this unit is currently moving. each frame the unit's location then gets updated. since I'm also using custom displayables (another very powerful advanced ren'py feature) as a basis for the unit sprites I can animate them based on a filmstrip, kind of making my own .gif support. since the unit is pretty much moving on its own at this point and I don't have to care about renpy 'interactions' anymore it's perfectly possible to give a different unit another order. I made a stress test based on this where about each second (every 50 frames or so) a new unit is spawned in a random free location and also gives a random move order to any unit that currently isn't moving. eventually this creates a mess of ants walking around through a maze of doodads (which you can also place wherever). even with hundreds of animated moving units the framerate is still pretty decent.
|
|
|
Post by limith on Sept 4, 2016 22:25:40 GMT -8
That framework sounds awesome vaendryl. How'd you do it, if you don't mind me asking. I'll send you a PM rather than spam the board with technical stuff few care about More of us are technical than you think.
|
|
|
Post by Azure on Sept 5, 2016 7:32:18 GMT -8
Did you use Transform inside the UDDs so that they change position and size? After your PM, I attempted the sprite manager approach with Sunrider. Since there were so many different calculations for position and size, I ended up abusing lambdas(anonymous functions). For transform written in ATL I used At. Everything I tested works works but I'm wondering if there is a more efficient approach.
|
|
|
Post by vaendryl on Sept 5, 2016 18:11:12 GMT -8
I use transforms to affect alpha and maybe zoom/size in some cases, but not position. If I need to affect the image position on that level I blit the image into a different empty render at a certain position. may not be very efficient though. most positioning gets done on the sprite level.
|
|