Bay 12 Games Forum

Please login or register.

Login with username, password and session length
Advanced search  
Pages: 1 ... 12 13 [14] 15 16 ... 31

Author Topic: Can delphonso make a commercial game?  (Read 49885 times)

King Zultan

  • Bay Watcher
    • View Profile
Re: Can delphonso make a better game?
« Reply #195 on: August 04, 2022, 03:23:15 am »

Sounds pretty cool, can't wait to see it happen.
Logged
The Lawyer opens a briefcase. It's full of lemons, the justice fruit only lawyers may touch.
Make sure not to step on any errant blood stains before we find our LIFE EXTINGUSHER.
but anyway, if you'll excuse me, I need to commit sebbaku.
Quote from: Leodanny
Can I have the sword when you’re done?

delphonso

  • Bay Watcher
  • menaces with spikes of pine
    • View Profile
Re: Can delphonso make a better game?
« Reply #196 on: August 07, 2022, 09:37:39 pm »

Okay, so...it's been a week and I haven't done anything. Let's get started.

Here's what I'm thinking: roguelikes are horribly violent affairs where you wake up in someones basement and kill everyone you meet until you die. Obviously some of that is appealing. But, I personally find that very exhausting and stressful (which might be intentional to the design, because then you are encouraged to play again.) Instead - I want to make a simple "overworld" where you can walk around and talk to NPCs. This also has the benefit of being very easy for me to code, so I can crack that out in an afternoon (of course, currently there's a man drilling a hole in my bathroom wall and I can't even think because of the noise).

Here's my basic outline - each box requires some amount of research/effort that is significantly different than the others.



Step 1: Home
This will be quite easy. I'll set up grid-based movement (which I realize hasn't been done in this thread yet), the basics of graphics and tilesets. I'll built the basic structure of the game here, but leave out the complicated stuff like combat and dungeon gen. My hope is to do all of this today.

Caveat: "look" which is a feature of many roguelikes, is something I actually don't know how to do off the top of my head, so I'll do a bit of research on what is a good way to implement a look interaction much like DF's 'l'ook in adventure mode. This is important for me because I want to add descriptions to creatures/objects. It's easy and adds a lot of flavor to a game. See below.

Step 2: Dungeon Gen
There's a few ways to do this, but the important stuff is this:
when you enter the dungeon it gets generated based on the info we feed it from elsewhere in the code.
I want the ability to "back out" of the dungeon if things aren't going well.
The dungeon also need to ultimately lead to a goal.
A boss creature should be on each level, either roaming or sitting right by the stairs down.
The stairs down could also just be something abstract like a valve you release or a handle you crank.
I would love the ability to add NPCs to the overworld by rescuing them from the sewer. This might be too much, but can easily be added with a simple interaction and they teleport away. It feels better if they follow you/engage in combat on your side. But that's pretty complex.

Step 2.5: Automata.
I've got a friend who is pretty well-versed in this method of generation and it would be good study for me to learn how to use it to make dungeons (or really anything.) This would be a lot of research though.

Step 3: Incrementing
Making the dungeon parameters bigger is easy. Scaling enemies is tougher but still, should be okay. Scaling the character to match is...more difficult. The simple solution would be to randomly increment whatever stats you have - something like how Fire Emblem characters randomly level up.

Step 4: Ending the game
Having some goal which is communicated to the player is good. Having the goal be achievable is better. This should be simple one level generation is done (just storing values in a singleton somewhere. I'll aim at just 3 or 5 levels, but we'll see how much I can extend it after this.

As for the tutorials: rather than follow Bozar's tutorial or Thoughtquakes, I'm probably just going to cannibalize their tutorials for my own needs when I get to them. We will see how well this goes. Anyway, I whipped up some boss descriptions real quick this morning: I'm pretty satisfied with them so far.



King Zultan

  • Bay Watcher
    • View Profile
Re: Can delphonso make a better game?
« Reply #197 on: August 08, 2022, 05:19:33 am »

I'm liking the sound of all that, also it seems like most roguelikes just ignore the surface.

Given that the game takes place in a sewer I feel that a turd man should be one of the enemies we have to fight.
Logged
The Lawyer opens a briefcase. It's full of lemons, the justice fruit only lawyers may touch.
Make sure not to step on any errant blood stains before we find our LIFE EXTINGUSHER.
but anyway, if you'll excuse me, I need to commit sebbaku.
Quote from: Leodanny
Can I have the sword when you’re done?

Starver

  • Bay Watcher
    • View Profile
Re: Can delphonso make a better game?
« Reply #198 on: August 08, 2022, 08:28:26 am »

I'm liking the sound of all that, also it seems like most roguelikes just ignore the surface.

Given that the game takes place in a sewer I feel that a turd man should be one of the enemies we have to fight.
...to the accompaniment of zither-music?

(And "...smells of elderberries" has got to go into the boss-description mix. ;) )
Logged

brewer bob

  • Bay Watcher
  • euphoric due to inebriation
    • View Profile
Re: Can delphonso make a better game?
« Reply #199 on: August 08, 2022, 08:44:42 am »

Instead - I want to make a simple "overworld" where you can walk around and talk to NPCs.

I wish more games would concentrate on this part instead of murderhobos on power-trips, which gets really boring really fast.

(Ultima IV had a clever way of dealing with this problem, but I don't know if the same has been done much since then.)

delphonso

  • Bay Watcher
  • menaces with spikes of pine
    • View Profile
Re: Can delphonso make a better game?
« Reply #200 on: August 09, 2022, 02:42:06 am »

I'm pretty hung over, so...this isn't gonna be very detailed. Just an fyi, bruvv.

So - what did I get done yesterday? Not heaps, honestly. It felt great to get back into the coding mindset, and the boss description generation was a nice and easy starting point.

Gridbased movement:

So, to establish grid based movement, you just make everything locked to a certain number of pixels. Since I took a 24x24 DF tileset (This one!) to get started, everything is locked to 24 pixels. This movement handling is the tidiest I've ever made it, as well:

Code: [Select]
const GRIDSIZE = 24
var moveinput = {
"right" : Vector2.RIGHT,
"left" : Vector2.LEFT,
"up" : Vector2.UP,
"down" : Vector2.DOWN
}
onready var ray = $RayCast2D
var movement = Vector2.ZERO

func _ready():
position = position.snapped(Vector2.ONE * GRIDSIZE)

func _unhandled_input(event):
for dir in moveinput.keys():
if event.is_action_pressed(dir):
move(dir)

func move(dir):
ray.cast_to = moveinput[dir] * GRIDSIZE
ray.force_raycast_update()
if !ray.is_colliding():
position += moveinput[dir] * GRIDSIZE

Simply, we have all the direction keys you could press and their objective direction (Vector2.LEFT is always left on the screen). When you press a key, you shoot a raycast out to the next square over. If that raycast collides with something, then you don't move there. Otherwise, you'll move. Simple as!

The benefit of this is that I can use Godot's built-in collisions this way. Otherwise, I'd need to make some sort of game-board-manager which checks if you're moving into an occupied space or not. This might become an issue when we run into pathing enemies - but we'll cross that bridge when we come to it.

I drew some shapes (some with collisions and some without) on the game map and moved our character around. I also added a HUD level and camera which follows the player. All those basically work out the box and require no modification. A similar text box to what I used in Capumon is thrown at the bottom giving information on inputs for now. Yesterday, the movement stuff didn't work.



I mean - it worked, but it worked weird. You could walk through the top most walls, and also you'd get caught on some geometry and wouldn't be able to move freely - this was especially bad down by the wall/dude where there's only one space free in between. So...why not? The code certainly looks right.



Unfortunately, I'm an idiot and left the raycast (the little arrow) on the top left corner. Meaning, it was casting out from there and checking the top corner of the nearest square. Obviously this meant it acted weird and not like the collision is intended. I move the ray-cast to position 12,12 - i.e. the dead center of the character. Now we're all good. So, let's make an overworld.



I draw a quick little DF-style town and give a clear outline borderwall. The town is just about the right size, I think. I'll add some things to discover here at some point. Now, you may have noticed that everything is really fucking pink. Godot is a game engine and not really an image editor, so although it may have been possible to convert the pink (actually "magenta", rgb 255, 0, 255) to transparent in the game code, I decided this was a bad idea and installed a terminal-based tool called "imagemagick". A quick command later (>mogrify -transparent "rgb(255,0,255)" curse24.png) and the pink is gone!



Now... let's add some basic talking/dialogue.

I assign the "ui_accept" button (Enter) to be the "talk" command. You'll need to be next to someone to talk to them. Because of how I built the town's tilemap and NPCs (namely, they're all just one giant continuous object), it'll be hard to make that ray-cast do the heavy lifting and talk to people. When we get to the dungeon, we'll probably need to set a separate tilemap for monsters, so the game knows what we're doing. We'll see, though - as that's a bit down the road. Enter, right now, just shouts out to no one if you're not next to someone:



Instead of using the ray-cast, I opt for an Area2D - which we used many times in capumon. An area has collision but does not do anything but check if something entered or exited that area. It's generally designed for collectables like coins in a Mario-like. I'll be using it to check if you're near enough to someone to talk to them.



Of course, the Area2D is looking to see if ANYTHING collides with it, which would include the little guy and the walls behind it. So, I made some quick adjustments and now the wall and NPC is ignored by the Area2D, but they still offer collision for the player.



All this does is check if the body which entered the area is a TileMap or not. Since the player isn't, you're all good.

As you can see, the dialogue is the same color as the walls and is immediately lost. I'm going to modulate both colors until I find something that is readable and still feels Rogue-y. Okay, back to drinking water and laying in bed for me.

Don't drink, kids.

Don't drink kids, either.

I'm liking the sound of all that, also it seems like most roguelikes just ignore the surface.

Given that the game takes place in a sewer I feel that a turd man should be one of the enemies we have to fight.

I know some of the classic rogues had the surface be the actual goal of the game - though I think many of them were more about moving levels down/up a dungeon/tower. Also, yes to golgothan turdman.

(And "...smells of elderberries" has got to go into the boss-description mix. ;) )

Love this. I find that sort of random generation endlessly fun. It also helps it's piss-easy in code.

I wish more games would concentrate on this part instead of murderhobos on power-trips, which gets really boring really fast.

(Ultima IV had a clever way of dealing with this problem, but I don't know if the same has been done much since then.)

I sort of understand it from a classic rogue perspective. Your character was going to die and probably pretty soon, so wasting time interacting with NPCs, etc, probably wasn't what people were interested in. I don't really understand it in a modern context where almost all rogue-likes tend to have a way for your character to keep going.

The Ultima stuff is a really interesting read. It seems Ultima was one of those franchises that really kept trying different things with its systems, rather than sticking to the same formula and just iterating it slightly each time. Very cool stuff.

King Zultan

  • Bay Watcher
    • View Profile
Re: Can delphonso make a better game?
« Reply #201 on: August 09, 2022, 03:09:50 am »

Looking like a pretty cool game already, also it's really surprising how fast a game can come together.
Logged
The Lawyer opens a briefcase. It's full of lemons, the justice fruit only lawyers may touch.
Make sure not to step on any errant blood stains before we find our LIFE EXTINGUSHER.
but anyway, if you'll excuse me, I need to commit sebbaku.
Quote from: Leodanny
Can I have the sword when you’re done?

delphonso

  • Bay Watcher
  • menaces with spikes of pine
    • View Profile
Re: Can delphonso make a better game?
« Reply #202 on: August 09, 2022, 07:09:28 am »

Yeah, whipping up a scene like this is pretty quick, especially with ASCII obfuscating a lot and making it simple visually. Handling movement and such is simple, too, as it should be, since Godot has so much built-in to help with this kind of thing.

When baby falls asleep, I'll see if I can't implement a quick and easy Look function to the game. I've got an idea of how to do it just like DF does.

EDIT: I got one working but I sent it to a friend for a second opinion. It's...fine.
« Last Edit: August 09, 2022, 08:55:57 am by delphonso »
Logged

delphonso

  • Bay Watcher
  • menaces with spikes of pine
    • View Profile
Re: Can delphonso make a better game?
« Reply #203 on: August 09, 2022, 10:54:28 pm »

Okay, so I made a look function that I'm probably going to offload the talk function to as well.

Before that, I'll mention that I tried to find a color scheme that works and these certainly do not. I'll...work on it. It's better, though - because you can actually read the text, although just barely.



The way this works is pretty simple - when you press 'L', the game reveals a little X reticle which starts in the same position as the player. When you move, it uses the same function to move, but ignores collision and also only moves the cursor and the camera along with it. The player stays where it was.



When you press escape, everything resets. It's pretty simply just reusing the code that's already there and adding a few conditionals. But moving an X around the screen doesn't have a lot of functionality unless it knows what it's looking at. So.



Here's an enum. I didn't use this in capumon - but the idea is that you replace numbers with words so your code is easier to read. Here, we have a list of all the tiles in the tilemap - in order. Normally, I could address these with tilemap[0], for example, to get the dwarf smiley. Instead now we know it's a guy if we're looking at that.



So then, we iterate over the x and y coordinates of the screen and check if any of those tiles are a Guy or a Traveller (the dwarf warrior sprite). If they are, we add them to a list of the coordinates of guys.

We take that list an generate names for them using a simple combination like "Id" + "man" = Idman.
I just add that to the end of this initialization process.



In the global, we check if the look reticle is at the same global position as the guys are - and if so, we're looking at a guy! So we pass that back down the chain to the player's textbox and update it.



And so - now we can look!



I'll likely use this same method to add descriptions to tables, statues and the like. It'd be nice to just look at them in the terminal, and get more detail for statues/dudes when you press enter - but that's some logic I'll need to set up first.

Now, when you press Enter while the look reticle is on a guy, we get their name and a brief description (the description is the same for everyone currently, but should be easy to extend.)



This is exactly like how we talked to things in Capumon - a screen pops up over the rest of the screen, and displays text it gets from the global.



and here, I've just moved the talk function from the textbox to that same screen - it's still not finished. Unfortunately, because the Area2D handles whether you're in talking distance or not, it doesn't know which guy you're talking to. This is why I might shift it all to the same thing as the "look" function and just have it be a different key that gives a slightly different function when you press Enter. We'll see.

King Zultan

  • Bay Watcher
    • View Profile
Re: Can delphonso make a better game?
« Reply #204 on: August 10, 2022, 02:05:17 am »

I'm kind of hyped about this game and all you can do right now is talk and look at stuff.

Are the NPCs gonna be the same every game or are you gonna randomly generate names and disruptions every time?
Logged
The Lawyer opens a briefcase. It's full of lemons, the justice fruit only lawyers may touch.
Make sure not to step on any errant blood stains before we find our LIFE EXTINGUSHER.
but anyway, if you'll excuse me, I need to commit sebbaku.
Quote from: Leodanny
Can I have the sword when you’re done?

delphonso

  • Bay Watcher
  • menaces with spikes of pine
    • View Profile
Re: Can delphonso make a better game?
« Reply #205 on: August 10, 2022, 03:26:32 am »

Hoping to randomly generate descriptions and maybe some of the dialogue. We'll see what I have time for. I have an index of all the NPCs and the game automatically fills in some information when you talk or look at them, so it should be easy to just set up a few personality descriptions, a few physical descriptions, and a bit of dialogue and spread it out across everyone. We might end up with a silent protagonist because of this, but for now that's fine. Unsure if it should be the same guy every time who tells you to go to the sewer, or if it's more fun for that to be spread out as well (but perhaps guaranteed)

I just got the 'k' talk menu to work. Currently, I'll leave it at that and work on the next step, as that's basically everything needed for step one. I can go back and flesh this stuff out later. It's more important to build the bigger skeleton for now. Feels insane that this is basically only three days of work. Part of that is that we're doing a lot of stuff I've done before in Capumon, and I'm just shaking rust off. From here on out, I'll be going into new territory, which should be a lot slower but also a lot more rewarding. Hopefully I can generate some random dungeon rooms by the end of the week.

Still undecided on whether I should add some sort of fog-of-war in dungeon mode, or just bring the camera way deeper in... We'll see what happens, but probably one or the other will be necessary. Not to mention limiting the movement of the "look/talk" function - because currently it's completely unlimited.

King Zultan

  • Bay Watcher
    • View Profile
Re: Can delphonso make a better game?
« Reply #206 on: August 10, 2022, 05:54:33 am »

What do you plan on the dungeon looking like?
Logged
The Lawyer opens a briefcase. It's full of lemons, the justice fruit only lawyers may touch.
Make sure not to step on any errant blood stains before we find our LIFE EXTINGUSHER.
but anyway, if you'll excuse me, I need to commit sebbaku.
Quote from: Leodanny
Can I have the sword when you’re done?

delphonso

  • Bay Watcher
  • menaces with spikes of pine
    • View Profile
Re: Can delphonso make a better game?
« Reply #207 on: August 10, 2022, 09:30:20 am »

What do you plan on the dungeon looking like?

Sort of like this bird drinking a soda.


So, you may have guessed that I seem to have gotten it.

I decided, after a brief discussion with my local search engine, that a walker generator was the one for me. Come, friends, and explore this marvel with me.
I watched a few videos on walker generation, but found Heartbeasts' to be the best. You can find the repo for his stuff there - which I might need to dig into further to solve future problems.

So a walker is pretty simple - you start on a square, then move any of the cardinal directions. If you hit a wall, you turn. We'll also suggest it turn randomly and if it walks too far in one line. This is probably what dwarves with a fell mood do in DF when they're looking for someone to kill - though this time, we'll be storing the history of all those steps and painting a map with that history afterwards. Let's go through it...ahem...step by step.

Please, please, hold your applause.



So a walker essentially needs these three functions - the first one is the walk - where we walk a number of steps (roughly, map size). The second is the step function to check if we've walked outside the borders we want to go. Third is the direction changing algorithm, which will narrow the options down so you don't get stuck trying to walk into a corner for ages.

The top of the script looks like this:



This is the first time I've done a custom class in Godot (and honestly, one of the few times in my life). Basically, we're building a node like the many that Godot offers already. I should note that this is only a script in Godot, it is not attached to anything, and isn't autoloaded like a global - it's just a new type of node we're adding to the project: a Walker node (by class_name).

We set up the directions we can go, our starting position and starting direction (just right for no real reason), and tell Godot what to expect for "borders" - we'll get into that later.

Our step_history array is what we'll actually be sending back out from all the functions here. It'll be a collection of coordinates recalling where our "walker" went. steps_since_turn is renamed to straightsteps later and is just there to keep track of how far we walk. It'll be important to contrast hallwayness which will control how far is the upper limit before we force the walker to turn. I set it to 6 to begin with.

The _init() should be real familiar if you did anything in Python before. This is something like "onready", but also allows the use of arguments from other parts of the program. It's just going to run this stuff first. We're going to make sure we can start in the starting position that we feed the walker elsewhere in the code. We'll also record our starting position as the first step in our step history.

Turning is the easiest to understand, so let's start there.



If we turned, our straightsteps is going to be reset. We then duplicate the collection of possible directions, erase whichever one was previously tried (we'll only turn after taking at least one step, and if not, it'll just remove turning right from the rotation), shuffle the directions and then pop_front one of them. pop_front is something you're going to see me use again later when we need to give an NPC dialogue directing the player, but can make the rest of the dialogue random. It takes the first thing in an array, adds it to the variable, then removes it from the array.

that is:
if this array is [69, 420, blazeit, lol]
var mynumber = array.pop_front()

The end result will be
mynumber = 69
array = [420, blazeit, lol]

Again, we want to remove it from the array because if it doesn't work, there's no need to erase it again, we can just try again. That's what the while at the bottom does - if we hit the wall with that turn, we'll just turn again. A walker can walk over itself, so if it's a rectangle that we're working in, we'll eventually find a way to go.

Let's work on steps next.



Our next step is going to be where ever we are plus the direction we want to go (default is right, but if we turned, it'll be something else.) We check if there's space within the borders (that's what has_point means), and if so, we move that way, add one to our step counter, and add the new coordinates to our step_history. We also return true, so the rest of the program knows we were able to take a step. If we couldn't (say, if the step was out of bounds), then we'll return false to let the program know it was impossible to go that way.

So let's put it all together in the walk program itself.



Walk takes an argument of "steps" which will be how long we want the walker to keep walking. This is roughly how big the level will be, but can also relate to openness - since the walker is pretty likely to walk over itself a couple times as it approaches a corner. We iterate over those steps, and see if we should turn (a random chance, and also a hard maximum with hallwayness), then we return the step_history which should contain everything we've done.
(eagle-eyed readers will notice the fatal flaws I made here)

With the walker done, let's make a quick scene of a Node2D and set it up!


I got the borders here in units of 24x24 - so at 1032x600, our window size is 43x25 units. I've put a 1 block border around the outside, leaving us with 41,23 for the interior rectangle. This could really be anything, since the camera follows the player - so the size is really just how much space do we want the walker to work with.

We add a new Walker to the scene! Since we defined it by class_name, the engine treats it like any other node, and we can call the functions in it immediately. Remember, it's waiting for a starting position and border size.



We set the starting position to roughly the center of the screen, but I might experiment with putting that start somewhere in a corner. We then give it that rectangle to walk around it. We call for 500 steps which will return that step_history to our new variable: map. we then get rid of the walker, since we don't need it. We then iterate over the map (which is just a bunch of coordinates like (24,13), (25,13), (25,12)) and paint a floor texture there from our tilemap.

I also set it so pressing Enter will regen a map. I did this in a separate project than Sewerkings proper, so it's only doing this map-gen. Oh baby, we're ready to go!



Well that's not very good.

So clearly something was broken. What's the best way to fix things? Print, baby!



And run it one more time!



Okay, so it's not turning. Well...why would that be...

It took me a bit to realize what I'd done. In the original walk function, you can see I put the return in the for loop:



And since it queue_frees as soon as it gets that variable assignment, it was killing itself after literally one step. I added an additional conditional as a safety net as well:



Now the return is in the right place, and it'll turn if all else fails (for whatever reason).

Now behold! Glorious sewer!



I futzed with the settings and feel pretty good about 20% chance to randomly turn and hallwayness at 3 - so it pretty regularly goes 3 steps, but not always.

Starting tomorrow, I'll need to put together how to add players and end-goals to this map we've made, but that's a problem for tomorrow delphonso.

King Zultan

  • Bay Watcher
    • View Profile
Re: Can delphonso make a better game?
« Reply #208 on: August 11, 2022, 03:24:22 am »

That's a fancy looking sewer generator you got there.
Logged
The Lawyer opens a briefcase. It's full of lemons, the justice fruit only lawyers may touch.
Make sure not to step on any errant blood stains before we find our LIFE EXTINGUSHER.
but anyway, if you'll excuse me, I need to commit sebbaku.
Quote from: Leodanny
Can I have the sword when you’re done?

delphonso

  • Bay Watcher
  • menaces with spikes of pine
    • View Profile
Re: Can delphonso make a better game?
« Reply #209 on: August 11, 2022, 08:27:33 am »

Ahead of schedule:

Since that walker gen gives us a list of all the coordinates that are now floor, we just check which one has the highest and lowest X value and then we're left with the left and right-most locations, which become the player's starting location and a goal-point.

I did just a bit of work to link everything back up so now we have a basic game loop. The player can enter the sewer and get back out of it. So - what now?

I zoomed the camera in by 50% and detached the camera from the look/talk reticle - which means you can technically look all over the map, but you'll only get info in the textbox, and have to keep track of where you're looking yourself - this is a de facto view limiter. I'll work on it eventually.

I don't have a lot to share because all I did today was a lot of prototyping of name, description, and dialogue generation which I should be able to implement tomorrow (then release a playable demo for anyone who wants to.) Since I now have a good idea on the formula to do so, I'm making a bit more content at the moment (just a few extra descriptions, names, etc)

So here's the question - what to do with combat?

Classic rogue combat is just bumping enemies and rolling dice - which I'm sure I can implement quite quickly.

But what if...what if something more exciting?

Since I'm ahead of schedule and haven't done anything to set up combat yet, now is a great time to prototype a different combat system than the classic rogue bump. A zelda-like action RPG sword would be terrible in the grid-based format we have, so that's out.

Or is it?

What's with all these rhetorical questions?
Don't answer that!

You ever played Earthbound?
Answer that one yes! Using some simple path-finding, we can make enemies run at the player, or just let them mill about the level. Running into an enemy can take us to a new battle scene, and that can be whatever we want.

Old school Final Fantasy-like combat would be fun to test and would also benefit from having party-members discovered in the sewer. However it is only interesting when deeply complex, and as we saw with Capumon - that complexity is very quickly exponential.

Something simple like tic-tac-toe or rock-paper-scissors is simple and pretty fun - but also either crushingly easy to defeat or purely luck-based.

Godot can handle big groups of npcs fighting each other, so maybe something with 10 vs 10 teams or something - again, these are pretty passive, so they end up being luck-based or barely tactical.

I'm not really sure here and very open to combat suggestions.

As I said, I'll try to implement the dialogue, description, and name systems tomorrow and put it up on Itch.
Pages: 1 ... 12 13 [14] 15 16 ... 31