Index cards

Posted by Adam on 16 April 2019 at 5:02 pm

After production of Feudalia stopped abruptly last year, I have been trying to get the project up and running again. There have been—and will continue to be—a number of IRL challenges that will affect this, but I expect that by the latter end of this year, things should settle down and I will be in an even better position to proceed with this amazing project.

One of the problems I have found is that the breadth of what I want to incorporate into this game and its universe is so vast that it's hard for me to keep track of things. Previously, using GitHub, there were hundreds of issues, they contained everything from things I needed to work on tonight such as fixing issues with grass swaying in the wind to more obscure things like ecology and gemstones. Not only was it hard to track things, but really, things were getting lost in the noise. It's great to have all those ideas, but it's also nice to have a clear view of what's important now and what might be important later.

My idea to both get back into the production of the game and to reduce this paralysis by analysis, is to go old school. After all, the idea to get into game development was to try and recapture some of that fun from the old days of programming. In my day job, which I do enjoy a lot, I do a lot of what could be considered boring stuff. It's not boring, but it's also doesn't capture my imagination in the same way that sending UDP packets across the UK over copper cables when I was 10 did.

So, index cards huh?

Pretty simple really, I write the card number in the top right, the type of card in the top left, I can add metadata like the lime green link number, which refers to a link I have stored in a specific folder in my browser. I then add some details, but not too much. The idea is to not fill up the tickets—or well, index cards now—with so much detail that when I come to do the work I feel like, well, not wanting to do it. The laziness of not wanting to write will help in this regard.

So far, I've picked out the most important issues from the list, and written them down. The current game already had hundreds of tickets closed, and what remains is mostly what I had planned for the MVP which, really, should have hit before Christmas.

This game may will take a long time to complete, and as it is a labour of love, I don't mind this, but I hope to follow in the steps of my forefathers and release playable and enjoyable versions of Feudalia long before then.

Follow us

If you're interested in supporting us, or signing up to receive pre-alpha releases, take a look at our Patreon.

And why not follow us @plumphelmetcave as well?

This post is from the First Era of Plump Helmet.

This was before the great break of 2019-2021 and the predominant project of the time was Feudalia. The project was placed into cold storage and has not been revived yet. The dream remains alive however. These posts have been kept for posterity.

Back in action!

Posted by Adam on 23 January 2019 at 5:09 pm

We don't currently have many fans, but we do have some, and some of you may have noticed that just as the momentum started to build, the websites went offline and our social media accounts went quiet. We're sorry about that, and well, as the lone developer working here at Plump Helmet, I—the narrator—am sorry about that.

Sometimes in life, as you're trying to juggle day jobs, family, and everyday adult life, with making your dream game, things can get a little stuck, and that's exactly what happened to me nearly half a year ago. Unfortunately, there have been some quite major changes in my life, and so development of Feudalia had to be halted.

But, not forever. The ideas behind this game, the wealth of imagination and the power of what could be, it's too much to let die before it was ever truly born. To take everything Dwarf Fortress has taught me, all the hours of fun RimWorld has given me, and to distill these into something truly unique and enjoyable for the world to sample, well, that's just too much for me to say no to.

I'm happy to announce that I will not give up. Development of Feudalia has resumed. The engines of Plump Helmet run once more. And while progress will be slower to begin with, it will be made, and the game will continue to move towards it's first release, sometime in the future.

To those of you who got in touch, thank you, and to those of you in the future who are reading back, this is but a bump in our history.

Please stay tuned over the next year.

Follow us

If you're interested in supporting us, or signing up to receive pre-alpha releases, take a look at our Patreon.

And why not follow us @plumphelmetcave as well?

This post is from the First Era of Plump Helmet.

This was before the great break of 2019-2021 and the predominant project of the time was Feudalia. The project was placed into cold storage and has not been revived yet. The dream remains alive however. These posts have been kept for posterity.

Announcing Feudalia

Posted by Adam on 29 July 2018 at 6:55 pm

We are happy to announce our upcoming game.

Feudalia is a medieval settlement sim, inspired by Dwarf Fortress and RimWorld, building on the art direction of Prison Architect & RimWorld, in the grim setting of medieval middle Earth. Build your settlement in a simulated world. Farm crops, raise livestock, harvest ore, smith weapons, research mechanics, and discover magic, as you hunt, trade, forage, and fight for survival.

We're happy to confirm Feudalia will be available on Steam for early access once ready.

Mod support

From the very get go we're building in mod support. The first thing you'll see when you start the game, other than a splash screen perhaps, is the loading screen, as it loads all the mod definitions into the game. It's also generating the background world you see in the menu at the same time.

One thing we love about both Dwarf Fortress & RimWorld is the content that the community provides. That's why mod support is the foundation from which we're building the game, so all the core functionality from plant definitions to skills to world generation is available for modders to use and modify.

Loading mods doesn't have to be boring

While there isn't too much to elaborate on for the main menu, we thought you might like to see it in it's current form. Load Game, Mods, and Settings are currently disabled until they are implemented.

Well, it's a menu

Create Faction

Upon starting a New Game, the first screen you'll see is the Create Faction screen. In this first screen, you'll get to choose a name for your merry weary band of adventurers settlers, along with an emblem to represent them. In the future, we may add scenarios to this section, helping you tailor your faction and story. For example, you could be five settlers looking to setup a new trading post, or a lone sorcerer, looking to exploit the wireless efforts of your earth golems to build a wizarding tower.

As opposed to the depressed majority

Settlers

On the next screen, you get to pick your settlers. You'll be able to randomize the entire lot, or each settler individually. Each settler comes with a background - do they come from the peasantry or perhaps royal blood, or are they exile from distant lands? They also have a profession, which conveys with it a bonus to certain skills, though be wary, some profession carry skill penalities too.

Along with the long list of skills, each settler will also have some attributes. These are mutable and may change throughout the life of the settler. The skills are split into one of four groups - economic, magic, military, and social.

While most people are magically inept, there are those among the worlds of Feudalia who posses magical abilities: alchemists, working in their labs; arcanists, controlling the elements themselves; diviners, inferring dangers from the wind; enchanters, turning exceptional weapons into true legends; healers, who can mend bones without gypsum plaster; and the most vile of all, sorcerers, consulters of spirits and demons, summoners of golems and beasts and more.

Currently, all settlers are naked. We're working on that.

Schott, Albert Schott, Naked Shopkeeper extraordinaire

World Generation

Finally, the last screen you'll see is the World Generation screen. This simple screen encapsulates the world generation, where from over 10 playable biomes, each with their own climate and terrain, you can pick you embark region. There is a lot more that we're going to do with these screen, eventually doing away with the window and having a fullscreen embark mode. The world also needs lakes, rivers, named regions and more.

And on the 7th day, the world continued to generate

Pre-alpha release

Thanks for reading this far. What you see so far is the majority of our first pre-alpha release, 0.1.0-96 genesis. While there is a lot going on behind the scenes, the "in game" section itself is mostly terrain, plants, and time. Over the course of the next month we'll be working on the view engine for the game proper. While we are using Unity, for the most part, we're only using it for rendering purposes.

We look forward to sharing more with you over the coming months.

Follow us

If you're interested in supporting us, or signing up to receive pre-alpha releases, take a look at our Patreon.

And why not follow us @plumphelmetcave as well?

This post is from the First Era of Plump Helmet.

This was before the great break of 2019-2021 and the predominant project of the time was Feudalia. The project was placed into cold storage and has not been revived yet. The dream remains alive however. These posts have been kept for posterity.

Mesh Splitting

Posted by Adam on 16 July 2018 at 1:33 pm

While Unity may have introduced 32-bit Mesh index buffers, by default it still uses 16-bit indices, which means a regular mesh object is limited to 65,535 vertices. This is a high number, and arguably, you may ask if any object should really reach this limit. For the ground layers in our medieval settlement simulator, reaching this limit has been fairly easy.

With regions consisting of, by default, 200x200 tiles, or 40,000 separate tiles, and with each tile consisting of 4 vertices, we have 160,000 vertices for the ground terrain alone. These are split among the different map layers: soil, rich soil, sand, clay, etc, so on a diverse map, it's easy to have ~20,000 vertices per mesh, but then, on very homogeneous terrain, you can easily breach the 65,535 vertex limit. The result is a truncated mesh.

Truncated mesh

This isn't great. It's the opposite of great. It's terrible.

To combat this, we need to detect when our procedurally generated terrain layers have exceeded this limit, and create multiple mesh objects. When we're ready to generate the meshes (which only happens in the very beginning, and later, only if a change has been made to the terrain) we iterate through every vertex in the mesh, and when we hit the limit, we create a new mesh and carry on counting.

Importantly, we make sure that for each "mesh split", we assign them to their parents, which in our case is each respective map layer.

// Create a new GameObject and attach it to the parent container.
GameObject gameObject = new GameObject(string.Format("MeshSplit_{0}", labelSuffix));
gameObject.transform.parent = _parent.transform;
gameObject.transform.position = _parent.transform.position;

We then create a new MeshRenderer component and assign a material, which uses a basic unlit shader with vertex blending (which we wrote about in our previous article on Edge Smoothing).

// Create a new MeshRenderer and assign the material.
MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
meshRenderer.material = _material;

Finally, we create a MeshFilter component and assign the relevant data to the mesh property.

// Create a new MeshFilter and set the data.
MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();
meshFilter.mesh.vertices = vertices.ToArray();
meshFilter.mesh.uv = uvs.ToArray();
meshFilter.mesh.colors = colors.ToArray();
meshFilter.mesh.triangles = triangles.ToArray();

With meshes now limited to 65,535 vertices, you can see that our rather large Soil layer is now split into 3 layers.

Split mesh

I'm sure there are lots of improvements that can be made. Later on we'll be looking at finding large cuboid segments that can be simplified into a single quad, but for now, there is so much more to do. But terrain blending is looking really nice. (Yes, I've been working on the textures.)

Terrain blending

Enjoyed this quick write up? Why not follow us on Twitter or Patreon?

This post is from the First Era of Plump Helmet.

This was before the great break of 2019-2021 and the predominant project of the time was Feudalia. The project was placed into cold storage and has not been revived yet. The dream remains alive however. These posts have been kept for posterity.

World Size Comparison

Posted by Adam on 9 July 2018 at 11:55 am

Sometimes you're using your trusty old single core laptop, other times you're sat at your 16-core battlestation which pumps out enough heat that it is your heating system. Either way, the games you play should be able to adapt to the hardware gracefully.

In our medieval settlement simulator, where the world is heavily simulated alongside your gameplay, one way we're going to address this is by allowing a range of world sizes when you're setting up your game in the first place. The default size is 480x270, or 129,600 individual sectors, that will be simulated with every passing day in the in-game world, though that can go as low as 160x90 giving 14,400 sectors, or right up to 800x450 for 360,000 sectors.

To show the effect of the size on the world generation, take a look at the below visual representations along with a breakdown of their generation*.

Smallest

Name: WorldGeneration (Smallest - 160x90 - 14,400)
------------------------------------------------------------------------
0   Variables                          0.008 ms /     0.008 ms (  0.00%)
1   GenerateElevation                 94.109 ms /    94.117 ms ( 37.37%)
2   GenerateTemperature               78.566 ms /   172.683 ms ( 31.19%)
3   GenerateRainfall                  63.666 ms /   236.349 ms ( 25.28%)
4   SectorGeneration                   4.411 ms /   240.760 ms (  1.75%)
5   UpdateSectorNeighbours             3.425 ms /   244.185 ms (  1.36%)
6   UpdateSectorBitmasks               7.668 ms /   251.853 ms (  3.04%)
7   CreateWorld                        0.002 ms /   251.855 ms (  0.00%)

Small

Name: WorldGeneration (Small - 320x180 - 57,600)
------------------------------------------------------------------------
0   Variables                          0.022 ms /     0.022 ms (  0.00%)
1   GenerateElevation                366.901 ms /   366.923 ms ( 36.08%)
2   GenerateTemperature              291.599 ms /   658.522 ms ( 28.68%)
3   GenerateRainfall                 293.972 ms /   952.494 ms ( 28.91%)
4   SectorGeneration                  17.424 ms /   969.918 ms (  1.71%)
5   UpdateSectorNeighbours            14.740 ms /   984.658 ms (  1.45%)
6   UpdateSectorBitmasks              32.178 ms /  1016.836 ms (  3.16%)
7   CreateWorld                        0.001 ms /  1016.837 ms (  0.00%)

Medium

Name: WorldGeneration (Medium - 480x270 - 129,600)
------------------------------------------------------------------------
0   Variables                          0.046 ms /     0.046 ms (  0.00%)
1   GenerateElevation                832.049 ms /   832.095 ms ( 35.82%)
2   GenerateTemperature              660.468 ms /  1492.563 ms ( 28.43%)
3   GenerateRainfall                 656.581 ms /  2149.144 ms ( 28.26%)
4   SectorGeneration                  65.737 ms /  2214.881 ms (  2.83%)
5   UpdateSectorNeighbours            33.504 ms /  2248.385 ms (  1.44%)
6   UpdateSectorBitmasks              74.693 ms /  2323.078 ms (  3.22%)
7   CreateWorld                        0.001 ms /  2323.079 ms (  0.00%)

Large

Name: WorldGeneration (Large - 640x360 - 230,400)
------------------------------------------------------------------------
0   Variables                          1.065 ms /     1.065 ms (  0.03%)
1   GenerateElevation               1497.784 ms /  1498.849 ms ( 35.52%)
2   GenerateTemperature             1203.489 ms /  2702.338 ms ( 28.54%)
3   GenerateRainfall                1201.902 ms /  3904.240 ms ( 28.50%)
4   SectorGeneration                  70.763 ms /  3975.003 ms (  1.68%)
5   UpdateSectorNeighbours            59.534 ms /  4034.537 ms (  1.41%)
6   UpdateSectorBitmasks             182.444 ms /  4216.981 ms (  4.33%)
7   CreateWorld                        0.001 ms /  4216.982 ms (  0.00%)

Largest

Name: WorldGeneration (Largest - 800x450 - 360,000)
------------------------------------------------------------------------
0   Variables                          1.687 ms /     1.687 ms (  0.03%)
1   GenerateElevation               2398.563 ms /  2400.250 ms ( 35.55%)
2   GenerateTemperature             1950.626 ms /  4350.876 ms ( 28.91%)
3   GenerateRainfall                1893.593 ms /  6244.469 ms ( 28.07%)
4   SectorGeneration                 144.208 ms /  6388.677 ms (  2.14%)
5   UpdateSectorNeighbours            93.394 ms /  6482.071 ms (  1.38%)
6   UpdateSectorBitmasks             264.655 ms /  6746.726 ms (  3.92%)
7   CreateWorld                        0.000 ms /  6746.726 ms (  0.00%)

* Note that as we're still in very early development, the world generation will expand to include more elements (such as inland lakes, rivers, volcanoes, settlements, roads, paths, and who knows what else) while simultaneously becoming more efficient as we refine the process.

Please consider following us on Twitter @plumphelmetcave or take a look at our Patreon.

This post is from the First Era of Plump Helmet.

This was before the great break of 2019-2021 and the predominant project of the time was Feudalia. The project was placed into cold storage and has not been revived yet. The dream remains alive however. These posts have been kept for posterity.

Newer Page 2 of 4 Older