Colony Simulation

Hello!

After the ceasing of my last project with a friend, we decided to part ways. He’ll continue to make professional indie games with either Unity or Unreal (he never really liked jMonkey :stuck_out_tongue:) , whilst I’ll also do games meant to be professional but it’ll be more as a passion and less as a job, i.e. having no revenue won’t affect me.

He’s more of a gameplay developer, game designer, artist than me and I am best suited for game engine development, tools programming and back-end programming. That’s why I love jMonkey : it’s open source (I already modified the engine to suite my needs), it’s not too big (I mostly fully understand what I’m doing and how it will affect the program) and it is modular. What we found out that jMonkey 3.1 was lacking was a better support for assets (using the SDK is a pain in the ass) and support of multiple animations on shared bones. One thing that we also had trouble with but was not directly caused by jMonkey was the physics.

Everything is not lost, as we learned a lot during the development of our unfinished game. I developed an expertise with jMonkey, I dealt with automatic asset enum generation, I practiced my git skills (one rarely ever truly understands what he does in command line with git :joy:, at least that’s how the people at r/programmerhumor think), I researched on procedural generation, I created my adaptation of the marching cubes algorithm, and so on. If you want me to enumerate more on what I’ve done and learned, please let me know. I just don’t want to spam the main post.

So, what type of project will I be doing with jMonkey? Well, I thought of a colony simulation game. Think of Gnomoria, a game that is appreciated and yet frustrates people as it is filled with bugs and bad GUI. The main reason for this is that it is considered finished by its developer. I’ll try to make my own Gnomoria inspired game but without the bugs naturally.

However, I’ll be starting my cursus at Isart Digital in September. I was admitted in the 2nd year of Game Programming. I hope it’ll be fun, challenging but especially that I will learn a lot.

I hope you’ll be able to see me grow as a junior indie video game developer and also see my projects being realized :slight_smile:

6 Likes

1 Like

Still a work in progress but here’s the link to the subreddit : https://www.reddit.com/r/CheesyGames/

2 Likes

Capture

  • Optimized the mesh bound update
  • Fixed a ton of bugs
  • Perfected the conception for generators (mesh and data) and chunks.

My next task is to add multiple chunks.

FWIW, in Mythruna, I hard-coded the mesh bounds for my chunks. It essentially does no real harm to just consider it the full potential chunk size.

Sure, culling may be slightly less efficient for certain chunks because they might look bigger than they are but in my experience it rarely came up.

That is exactly what I did :wink:

I even retained half of the original if condition because I didn’t know exactly all possibilities of use for the mesh bound.

public class ChunkMesh extends Mesh {

    @Override
    public void updateBound() {
        VertexBuffer posBuf = getBuffer(VertexBuffer.Type.Position);
        if (posBuf != null) {
            getBound().setCenter(GameGlobal.world.getChunkSize().x / 2f, GameGlobal.world.getChunkSize().y / 2f, GameGlobal.world.getChunkSize().z / 2f);

            ((BoundingBox) getBound()).setXExtent(GameGlobal.world.getChunkSize().x / 2f);
            ((BoundingBox) getBound()).setYExtent(GameGlobal.world.getChunkSize().y / 2f);
            ((BoundingBox) getBound()).setZExtent(GameGlobal.world.getChunkSize().z / 2f);
        }
    }
}

Looping over every vertex an trying to figure out the minimum bounding volume every time is totally overkill, as you said in you said in your own words.

Now, the only thing I don’t know is if calling a getter method multiple times is faster than storing a local variable. I think it’s faster with getters, at least in C++, due to my C++ teacher in college telling me it was more performant.

Calling get once can be faster usually but it doesn’t matter here as this should be called infrequently… personally, I’d set the bound on creation and then just stub updateBound() to do nothing.

1 Like

Multiple chunks!

It took me a long time because I was obsessed with bit calculations and optimisations. The answer to my major bug was however really simple.

Still a work in progress but I’ve finally finished the logic of the voxel traversal algorithm, a.k.a. ray cast for voxels.

2 Likes

I added the selection of the face of the picked voxel. It however broke 87 of my 366 jUnit tests… Fixing a bug may create others, or my first algorithm and my tests were most likely flawed.

3 Likes

Here an article I made which describe the simple generation and the algorithm a little bit. I also give a lot of code.

https://www.gamedev.net/blogs/entry/2265248-voxel-traversal-algorithm-ray-casting/

1 Like

2 Likes

Bonjour, Benoit.

That’s off to a good start. :v:

So Gnomoria is basically a Dwarf Fortress clone - or are there some fundamental differences between the two games that I’m missing (I haven’t played either one)?

I see a lot of overlap with what you’re doing and what we’re doing with Rituals of the old - if you ignore the obvious things like the camera angle and everything it entails, etc. We have plans to open source much of our infrastructure under permissive MIT license once we’re at a stage where we don’t completely embarrass ourselves by releasing our code.

When you get the engine running it seems you’re also going to be doing a lot of work with AI. We’re planning on doing daily routine and personality simulation for our NPCs, trying to get them working as a society. We were thinking of using libgdx/gdx-ai as a starting point to get things up to speed. Did you have any thoughts on AI at this stage?

Is your goal really to make a Gnomoria clone (sans the bugs and a better UI) or are you going to step it up a notch from there?

What kind of problems did you have with JME and multiple animations on shared bones? Could you tell me a little bit about that?

JME is certainly no Unity and it needs a lot more work to get things running, but on the plus side it’s relatively light and - come on - it’s Java! Everyone and their grandmother knows Java. That brings some excellent modding prospects down the line.

1 Like

Hello @Pilvinen!

Well, Gnomoria is way more simplistic and focused more on the colony and less on the individual. You might have noticed that Gnomoria is also cuter.

I feel ya. That’s nice of you guys to make the engine open source.

Yes, but I didn’t choose what exactly I want to do yet. Do I want the game to focus more on the dwarfs individually, just like RimWorld or do I want to focus more on the colony? Personnally, as a player, I’d like to have a huge colony and not have to deal or worry with each dwarf’s requests / preferences. However, I do not know what will sell more. Maybe I could have a system that if the player doesn’t want do handle each dwarf, it doesn’t matter because it will do it for him and if the player wants to do it manually, it’s also ok because it’s a feature? I’ll have to brainstorm on this.

I thought about it too. There’s a dude on jMonkey, which I don’t remember, who did a LibGDX’s AI library wrapper for jMonkey, although I’m not sure if it’s what I really need. I also did a LibGDX’s AI behavior tree importer for my last project. It works well but behavior trees can get extremely complicated quite fast.

Well, I have a lot of ambitions but what I really want right now is to finish a game that I am proud of. I have so many ideas to create new emergent simulation, survival or RPG games. Should I add some of those ideas to my game, if I finish? I’ll decide that when the times come :slight_smile: What’s for sure actually, is that enemies will be more challenging and fun.

Right now, with the current animation system, which a core developer told me he was going to change in the future, only one animation can be applied to a bone at the same time. While reading the source code, I noticed that it’s possible to patch which animation is going to be played by ordering the animation channels according to the playing animations priority. It does however process all animations but only the last one, the most important one, is actually visible at the end.

Not really ahah jMonkey is kinda big; it’s not the biggest but it’s far from light. To me, a small engine would be SFML, which isn’t even an engine by the way. But I get what you’re saying : it’s small compared to the big engines that everyone uses.

True :laughing: I really like Java not because I know it but because I’m way past the junior level with it.

I’ve looked at your website and it looks genuinely professional and appealing to the eyes. Our games have similarities but in the end they will be quite different, that’s what my sense are telling me, a.k.a. we won’t be competitors :wink:

By the way, is it your first game for the studio? If yes, then where did you get enough funding to survive while making the game?

Oh and what tools and technologies did you use to make your website?

I don’t know where you should need a wrapper when using it. At least we are using it just out of the box with JME. It has been long separated from the LibGDX itself also. If you were referring to MonkeyBrains, I don’t think it is a wrapper to LibGDX-AI but something of its own.

Yeah, but you will duplicates for vectors at least.

Oh no, I wasn’t talking about MonkeyBrains, someone really did a wrapper for LibGDX’s AI library.

To be the most performant and use the less memory (which needs to be recycled by the garbage collector) as needed.

Well, in that case, tell me when you find it :slight_smile:

I found it!

2 Likes

There aren’t so many good free voxel engines out there written in pure Java. And we don’t lose anything by making it public. It makes perfect sense to help others. And if someone does find it useful, we might get some pull requests back. Win win all around.

They do, they really do. But it’s still much easier to handle than a state machine. And you can use some tricks like keeping separate logic in separate trees and then pasting them to the main tree on the fly. Makes it a bit easier to navigate. But it’s also great fun. I absolutely love logic.

We talked about this at a length with our animator and coders and couldn’t figure out what you meant. I just… I don’t understand this situation where you would need to do two or more animations on a single bone at the same time. Could you give me an example of such a situation?

Like for example if you have a walk animation with the hands waving and all and then you take control of the right hand and whirl it around or something … but you wouldn’t really do two animations on a single bone. You’d just override the arm and play a single animation, right? Can you please explain what exactly is the problem? Maybe we just haven’t encountered it yet. I’m confused.

Yes. It is our first game. I got some funding by selling a bunch of stuff and investing in cryptocoins and selling before it peaked out and lost value. Don’t get me wrong, we don’t have a whole lot of money. It’s a hobby project at the moment and we really couldn’t afford to pay salaries even though it would be nice. We have enough money to pay for software licenses, web servers, etc for at least ~3 years forward. And we were able to purchase gigabytes and gigabytes of SFX, which was really nice. Expenses are still well under 10000 euros. We’ve been at this for a bit over two years now.

The website? I just made it in a few minutes with a terminal text editor over SSH. I do have some Bootstrap CSS styles in there so that it should work a bit better on mobile devices. Nothing special really. I absolutely loathe IDEs. Given the chance I always use just a text editor to do my work. Our lead coder looks at me down his nose for doing that :sweat_smile:

2 Likes