It's been a while since my last update and a fair amount has happened. The investment required to get my 3D game done was just going to be too much for a first game. So I'm making a 2D game and putting its revenue towards the 3D game. I don't know if the 2D game alone will be enough, but that is for the future me to deal with.
I started writing my own python code to replace Panda3D's python. There are a few reasons for this.
- Everything revolves around there being one main object (ShowBase) which stores most things on this single object. The C++ code appears to be designed in an object oriented way but the python seems to be lacking this.
- Support for multiple monitors in the python code seems like it was an after thought because of the way additional windows are stored. The main object (ShowBase) has functions on it like getAspectRatio. It doesn't make sense to ask the main object what the aspect ratio is for a window, you should ask the window what it's aspect ratio is.
- Debugging tools require a person to close down the game and edit the config file in order to enable specific debugging tools. This is just not conducive to the way a person developing a game works. These tools should be enabled and disabled through shortcut keys or the use of an in game console.
- Alot of things are added to the builtins. Some of these things do not make sense if you have multiple windows. It means that getting at render or render2d for the main monitor is easy but getting a second window or any of its node paths is troublesome and none of the functions provided are really usable for anything but the main window.
What I want to end up with is a hierarchy of objects with methods on the parent object to get instances of these objects by name. So the main object in my code will store things related to the Panda3D environment like the windows that exist or the default font to use. Windows should then store the cameras and nodepaths that are used by that window, and so on.
Progress on this code is going forwards thanks to one of the programmers helping me figure out how windows and node paths are associated. I'm hoping to be done the majority of these classes in a couple weeks since the requirements for the 2D game are quite low.
Progress is going a little faster since I went out and bought 12 more clamps. The supports are all built and I am working on the upper sections. In a day or two I'll have them as tall as I need and will start building the flat top where the saw blade will be positioned. As soon as the saw blade is in place I'll build the part that pushes the logs toward the blade. After that I have the water wheel, flume, and water runoff and then it is complete. I'm hoping I can finish it in a month so I can get back to work on the data side of things.
My python custom types are mostly done. There are still some tweaks to make which I will do while writing a test case. Temperature needs to allow negative values and calories and temperature need to allow a value of 0. I've already started integrating units into Everything to provide validation for fields and to rewrite values in the format I want. Still have a few more things to do but they will get done shortly.
Progress is going well despite being a bit slow. By building the model I have figured out how the saw mill works. There is one part of the construction that is going to be difficult to do because it uses a tree branch as a spring. Since I have a limited area to build the model finding a tree branch that will provide this function and positioning it in a way that will work may be difficult. As progress continues I will have to figure out how to handle this. For now though here is an image of what it looks like. I'm not going to explain anything as future images will show things.
While undergoing some changes to Everything I was about to start creating a number of new classes. The new classes would have been types of units allowing Everything to validate the data entered into fields that need specific types of data. Instead of creating python classes however I took a look at what would be involved in creating custom python types. Now I only touched C for about 15 days back about 15 years ago so I do not remember anything about C. So I looked over all the examples and created a basic first type based on everything I found. I then created a python class to test the speed difference between a regular python class and the C code. As expected the custom python type (written in C) was faster even with no C programming experience. So using examples and searching the internet I managed to create 11 custom types each with new, init, repr, and str functions. After that I created functions for comparing these new types as I will need to know things like if there is enough flour in a sack to make a loaf of bread. I still need to be able to add and subtract units which requires some more code so I will be searching for examples on that and getting that set up soon. And once I have that I'll get these new types in use validating data in fields and displaying errors if the data is incorrect.
I can already import data from new files. There are a few small changes I want to make before I consider this part of it done. There is the other part where the template for a data type is changed and I provide a way to import data into the new template. This will probably take a bit to get working as it isn't very high priority since the templates are not changing in ways that would lose data.
New Crafting Recipes
A few weeks ago I added 2 mead recipes and started researching barrels as I needed them. This has created new recipes that go through the entire process from a single oak tree to barrels. I have some stuff to finish figuring out with the oak tree I am currently using and will then need to add additional types of oak trees through this process as well. If oak tree wood varies in colour there will be the potential to have barrels in these colours. You will also be able to make barrels with either brass or iron hoops as these both existed.
I spent a fair amount of time researching medieval barrels. I found that there would be just too many types of barrels for my game so I needed to simplify things. For instance an ale barrel was a specific size where a wine barrel was a different size. That just seemed too complex for my game so I decided to only use 5 barrel sizes and not have each barrel branded by the cooper that made them (it was illegal to use unbranded barrels) as this would require a lot of textures to deal with. The barrel sizes I will have are the Tun, Hogshead, Barrel, Kilderkin, and Firkin. With these 5 sizes you won't need to deal with any politics of needing to use a specific barrel for ale, you just need to pick the recipe for the amount of ale you want to make.
With these changes I need to change my ale and mead recipes so they can be brewed for each barrel size. I will also need recipes to transfer from one container to multiple smaller containers since brewers would probably brew by the tun and sell smaller. I have no way to prove they did this in medieval times without spending more time researching, but I believe I spent enough ime already and it seems reasonable to me. Maybe further down the line I'll have time to invest in this or perhaps I'll come across some information while researching one of the many other things I need to. For now those 5 sizes should be fine.
Working on my First Model
By reading the heading you are probably thinking I am referring to a 3 dimensional object that fits inside the game. What I am actually talking about is a 3 dimentional model built for real which is going to be mostly popsicle sticks.
So far I have a nice solid base, a dowel with 4 hand drilled holes where 4 other dowels fit, and a single support attached to the base where one end of the dowel will fit. When I am done building it I hope to have a medieval water powered saw mill complete with a blade that hopefully can cut wood. It doesn't actually need to cut wood to display the idea and make the design of a 3 dimentional in game model much easier.
I had some issues with the way I was specifying what containers could contain. So over the weekend I moved this data into its own datatype called cargo.
Since the last update I've been working on my data import and reworking code so the rows used when editing an item can also be used in the import. The reworked code is mainly done and just needs some testing and potential bug fixes. Once the data import is completely done I'll import another 140ish forenames that I have set up in test import files. Also if you edit a template the data import will get used to migrate existing data to the new template structure.
I also decided to start adding surnames and found that medieval surnames are interesting. Surnames appear to be based on professions, where someone lived, nick names, and even the son of a persons forename. Of these types of surnames those based on locations won't really fit well in my game so I am going to not use any of these, but the other types will be used.
After looking at surnames based on professions I decided my hard coded list of professions was not good enough so I added professions as a new data type to Everything. I added 55 professions (which were my hard coded list) and then 54 surnames based on professions like Granger (farmer) and Smith (blacksmith). I have another 95 surnames which would are associated to professions I do not yet have, so I need to get these surnames and professions added.
I have not added surnames based on personal names like Johnson and Richardson or nicknames like Black, Little, and Armstrong but will be added these shortly after the data import is done.
I also made changes to existing data (buildings and recipes) associating them to professions where they should be. With buildings and recipes associated to professions it allows multiple professions to use the same building but each are only able to craft up what their professions allow. As an example a fertile field will be able to be used by a farmer to grow vegetables, an orchard worker to plant fruit trees, to grow grapes for making wine, or even as an herb garden.
And that is where things are currently at. Even though I'm concentrating on story for a while it still requires me to add other things in the process.
During Christmas holidays I discovered that Everything was taking longer to load than it needed because I was updating the display after every item was loaded. If I did this after every file instead things loaded significantly faster. So I spent some time trying to figure out the best way to load up the data as quickly as possible where updating the display would not slow down the load time. The easiest way to do this became obvious, I would create a new process which would load the data and the main process would check on the progress at regular intervals.
Everything now keeps all the game data in a secondary process and the main process asks it for things as needed. These changes are mostly done and loading data is much faster. Of these changes only one remains incomplete and that is because it itself is going to go through some changes to make it better than what currently exists. This will hopefully be done before the end of February but still requires some work to figure out exactly how I want to change it.
Other changes to Everything have been made as well. Five new types of data (characters, forenames, locations, schedules, and surnames) have been created and I have already started adding data for two of those types. Two of the other types still need to have their template revised a bit before I start adding data to them.
I have decided that for the next few months to the rest of the year I would put my time into figuring out my games story. An RPG requires a good story and so far I only have the beginning and very end worked out. I want my story to keep the player wanting to know more so they keep playing until the end. In order to do this I need to know the entire story and all the characters, places, and any items involved in it.
Thankfully I have data I had created in the past which defines some characters which will fit into my game nicely. I still need to figure out the role of each of these characters and any additional characters I need. And to make the game world seem more alive these characters will also have their own little stories that play out during the game.
It is going to be a lot of work and I may as well write it now so I have more time to revise it as much as needed before the game is done.
I decided to make some changes regarding game progress. Progress videos take a fair amount of time to plan, record, edit, and upload. I also have to be at home and if I get interrupted or someone in my apartment building makes noise it just makes it all worse.
Instead of spending time making progress videos I would rather invest this time into actual progress. This is one of the reasons why progress videos have been few and far between. I still want to provide progress but make it easier for myself so I do it more often.
So I've made some changes to my website. From now going forward this page will contain dated updates of the latest progress and the stats page will contain a small amount of information about the data and code.