Page 1 of 1

Reqvia - shoot'em up RPG

Posted: Fri Aug 23, 2024 4:44 am
by Viktor I.
Hello. I present to you Reqvia. This is the only 2D procedurally generated open world shoot-em up game (right now).
Years ago I was a huge fan of hardcore shmups (namely, Ikaruga and Raiden), which is presently a dead genre. Now, playing those games casually doesnt't really make much sense anymore (you would play for score or before you hit your skill ceiling and then (rage) quit), which is why I created Reqvia: a shmup with a lit bit of casual side. Because doging bullets is fun, but running out of lives and starting all over just to beat a short game isn't all that interesting anymore (Ikaruga is like 30 minutes long to complete without continues, just takes hundreds of hours to master). So in Reqvia you can explore a procedurally generated isometric world at your own pace, destroy enemy cities, build your own tiles on top, fight bosses, upgrade weapons an so on.

Image

Image

Image

Image

How it was made:
I am the sole developer of the game. All graphics were done by me in Inskape, code written in LOVE2D using as few external libraries as possible, music and sounds were created by me using Reason. Overall, it was very fun developing this game, and I will probably keep adding more content to it. Right now the game is available on itchi.io for $8,99 and you can try out the demo there.

https://reqvia.itch.io/reqvia

If you are interested, I can elaborate on the technical stuff some more!

Re: Reqvia - shoot'em up RPG

Posted: Sun Aug 25, 2024 11:23 am
by togFox
Nice job. The video is set to private only - at least for me. For a not-free game I highly suggest adding some text to your itch.io page.

I see the demo throws an error. You should redirect to a "sales" page that encourages peeps to pay for the full game.

How long did all this take?

Re: Reqvia - shoot'em up RPG

Posted: Sun Aug 25, 2024 1:18 pm
by Viktor I.
togFox wrote: Sun Aug 25, 2024 11:23 am Nice job. The video is set to private only - at least for me. For a not-free game I highly suggest adding some text to your itch.io page.

I see the demo throws an error. You should redirect to a "sales" page that encourages peeps to pay for the full game.

How long did all this take?
Thanks. I spent about a year and a half to learn to write effecient LUA code and conceptualize gameplay mechanics, then about half a year to actually write all the code, but I also had access to my vast collection of drawn vector graphics which is the result of about 6 years of drawing in Inkscape.

As for more information, full playthrough of the main game is about 8-10 hours long (if you know what to do), there are dozens of unlockable weapons, enemies and several bosses: it's all mostly bullet hell in open-world setting with some rpg elements. If you liked the demo, you will like the main game and vice versa.

Re: Reqvia - shoot'em up RPG

Posted: Mon Aug 26, 2024 5:15 pm
by Kontraux
Congrats man, it is really well done. Everything is so slick, I'm guessing it's partly the vector graphics, everything looks ultra-sharp. It gives your game such a distinct style. And yeah actually if you do want to talk about the technicals, I would be interested in how exactly that works. I don't know much about vector graphics, my understanding is that Love can't just draw them like a .png, did you have to build some kind of system to support them, do you convert them to meshes or handle them with a custom shader or something?

Re: Reqvia - shoot'em up RPG

Posted: Mon Aug 26, 2024 7:57 pm
by Viktor I.
Kontraux wrote: Mon Aug 26, 2024 5:15 pm Congrats man, it is really well done. Everything is so slick, I'm guessing it's partly the vector graphics, everything looks ultra-sharp. It gives your game such a distinct style. And yeah actually if you do want to talk about the technicals, I would be interested in how exactly that works. I don't know much about vector graphics, my understanding is that Love can't just draw them like a .png, did you have to build some kind of system to support them, do you convert them to meshes or handle them with a custom shader or something?
Hi, indeed, LOVE doesn't have pure vector support. There are some libraries, but the vector format is a lot of math and just way too complex to deal with directly (but it's probaly possible). Instead, I have tons of prepared gradients, ui icons, paths and shapes as Inkscape files, which I can easily combine and change and then rasterize to use as .png
I also extensively used HotParticles editor to animate every effect (and some trigonometry functions as well). Water is animated with a Voronoi noise function in shader. No sprite sheets or atlases were used for animation since all sprites are a lit bit upscaled (and RAM usage grows quadratically with higher image resolutuion), so all animations are procedural.

As for the code, the game is mostly written using OOP with meta-tables for inheritance.
This the only class functionality I ever needed:

Code: Select all

local Class = {}
Class.__index = Class
function Class:new() end

function Class:derive(class_type)
    assert(class_type ~= nil, "parameter class_type must not be nil!")
    assert(type(class_type) == "string", "parameter class_type class must be string!")
    local cls = {}
    cls["__call"] = Class.__call
    cls.type = class_type
    cls.__index = cls
    cls.super = self
    setmetatable(cls, self)
    return cls
end

function Class:__call(...)
    local inst = setmetatable({}, self)
    inst:new(...)
    return inst
end

return Class
Terrain is generated and rendered with the LOVE noise algorithm, but player-built and pre-built tiles replace the noise algo with Szudzik paring function to track coordinates of the placed objects (and they go into save file). That way I don't need to keep in memory x and y coordinates of all tiles, only the indexes of built tiles (which are just the result of Szudzik pairing of x and y). And by using Szudzik I can efficiently find, render and interact with any tile in the world.
In the early stages of development I tried to create thousands of tiles at once as objects to procedurally create the world, and LUA would eventually start leaking memory and the garbage collector seemingly would stop working. At that point new projectiles would start to increasingly consume dozens of megabytes of memory for no apparent reason. Luckily, pairing functions and noises allow to generate the world in fast manner without storing all the tile info in the memory at once.
So, in OOP sense, procedurally generated tiles are just the result of noise, player-built tiles are objects (which can be interacted with), enemies and projectiles are objects (which is not ideal, but I couldn't come up with a way to store projectiles more effeciently and being able to attach some functionality to them at the same time).
I tried using something like ECS instead of OOP, but the systems started to entangle with each other which would cause memory leaks, so instead I mostly used OOP while trying to "curb" it as much as possible to use less memory.
Animations are all procedural, collisions are mostly aproximated as distance between circles.
When I needed objects to use new functions, I would create or extend new class. I was using SOLID to structure my code at first, but then ditched most of the OOP guidelines to actually write working code faster. In particular, Liskov principle might increase overhead and makes it difficult to debug.

By the way, does anyone know how to code UI for LUA in fast and efficient manner? I resorted to make every interactible element as object with hover function in class and position them using something akin viewport units in CSS, but I had to painstakingly align each element with each other (like buttons with text) and it would just take forever.