A lot has happened since the last time I wrote a blog post, changes have been made. The changes have focused on managing the office life and on the GUI.
The visual style is starting to come together, in the above picture you can see a green outline around the selected room. The trees really make the scenery come to life.
I implemented a stock market. Initially I just wanted a “buy company” button, but this adds so much more depth. Basically, you can sell shares of your company to avoid paying interest on a loan, but giving away too much of your company will affect your company productivity.
You can also sell and buy stocks from other companies by observing their product life cycles, to predict when their income will have an upswing. If a company loses 100% of their shares, the company with the largest share will win the company’s products and the rest will get their stocks refunded.
In another update you will be able to create sequels to all your products, which will add a big bonus if done right. So taking over companies and their intellectual property will be very profitable.
Here’s a screen of a lot of GUI. I have implemented staff; employees work on products and the staff will make sure that the employees have a good working environment.
Cleaning staff will dust off foot prints on the floor, which will increase the room environment and in turn increase employee effectiveness and janitors will fix broken stuff so that the employees can use it and enjoy doing so. Later I will add IT staff to fix computers and chefs to cook food.
Employees have also developed thinking and demands, specifically they can demand a raise when they are not satisfied with something.
In the second picture we can see that not having a toilet can be ignored if your pay is increased by 78 dollars per month, which is extremely realistic, if I have to say so myself.
Finally, I have improved work items(design document, alpha, marketing, support, contracts, etc.) in the GUI. Before, they kind of took up most of the right side of the screen, but now they can be collapsed and pinned to the rooms of the teams working on them. They can actually be dragged directly on to a room and the team in that room will begin working on it.
I have also enabled multiple work item per team, each item will be given an equal amount of time from each employee, thus slowing down. If there are too many work items per team the employees will complain.
I’ve been gaining a lot of motivation from using Trello and my Changelog script, which has culminated in finally creating the dreaded “Main Menu”, albeit with missing menu items. In the ~13 years I’ve been programming, I’ve created maybe 3 main menus. Needless to say, I consider this a great success.
Making a point system for my tasklist on Trello (easy=1, medium=2, hard=3) and automating the report has helped immensely. I’m now somewhat able to quantify my progress and it feels extremely satisfying putting tasks in the done list. It feels like a game. It has the added bonus of giving me a more precise way of predicting milestones, by comparing how many points I’m getting per week and comparing with how many point are left.
Here’s the PHP script that generates the changelog. It requires labels named ‘Easy’, ‘Medium’ and ‘Hard’ and your cards should all be labeled. It also requires a list in which you put all the cards/tasks that are done.
This week I decided to work a bit on the audio to make this trailer for shits and giggles.
9 years ago I started making rap music (pretty typical gamedev hobby) and I got pretty okay at composing, mixing and recording and stuff like that. I also spend an ass-ton of money on recording equipment, software and instruments and about 4 years ago I stopped, because of just life happening. So to avoid having wasted a lot of money and time I’ll be recording all sound effects and compose all music for Software Inc. You can listen to stuff I made some years ago on Myspace.
For now, I recorded water boiling for the coffee machine, a refrigerator opening and closing, myself saying “bla bla bla”(not included in download) for meetings, punching on the keyboard, pouring water down a toilet and flushing, and my computer fan.
I had a problem adding the sound effects to the game though, since the only way to really hear them clearly was to position the camera directly above what you wanted to hear, and it seemed pretty unnatural. So I decided to move the listener away from the camera and down to the ground, to where the camera is focusing.
Normally, when I want to do RTS like camera movements, I add an empty focal object on the ground and add the camera as its child transform, pointing towards the focal object. When I want to move the camera around I just move the focal object on the ground. Rotation works by rotating the focal object, so the camera rotates with it, always pointing towards the focal point. Zooming is just moving the camera closer on the local z axis. So, my audio listener hack only required me to add the audio listener as a child transform of my focal object.
Anyway, I wanted to share my sound effects with you, since they were pretty easy to make, but required a lot of expensive gear you might not have. You are free to modify the files and use them any way you want, and you don’t even have to give me credit or anything like that. CC0 license.
For this week I worked a lot on GUI stuff, setting up a pretty big pain for myself when the new version of Unity, and thus GUI system, hits.
Being a management game, there’s a huge correlation between the GUI and the actual game, so implementing GUI stuff also meant implementing a lot of the game mechanics. Here I’ll detail some of the core mechanics. I will start by noting that all software types,simulated company types and name generation files are contained in CSV files, so they can all be modded.
I finally finished implementing everything needed to complete a development cycle. Each phase has a little box to the right of the screen, where you can see its progress, as the team assigned to it, is working.
You start at the design document, the trick here is to keep the progress bar in the center, if you do too little, the design document will be worthless, and if you do too much, it will be overly complicated. Both resulting in a reduced amount of achievable final quality.
When the progress bar is the greenest you promote it to alpha. You then assign a team of programmers and artists to the alpha, depending on what type of software it is. When the alpha is done, depending on how uneducated your employees are, a delay phase will start, you can skip it, but that will add a lot of bugs. Finally, the beta phase is entered where the employees fix as many bugs as possible until you actually release it.
When you release the product, a support item is added to the work items. The support item will continually generate support tickets until all bugs are fixed. Ignoring or cancelling the support item will decrease company reputation.
You can market the product through the entire development cycle. If you market it during development, it will create an awareness boost for when the product is released. When the product is released, you can talk to the press to continually add a little amount of awareness or create an advert to unleash a big awareness boost all at once.
The design document window is where it all happens. Here you get to create the product, which entails some important decisions. First you pick a software type (the name can be chosen manually or generated by clicking the “Name:” label). Each software type has tiers, which control how long it takes to create and how much money it will make. Here I’ve chosen to make a Game with the tier Indie Game, which is the lowest for this software type.
Next you choose the operating system, if applicable. You can add as many operating systems as you like, each also having a tier (Phone, Console and Computer). Each operating system is in use by an amount of the population, so you lose the ability to sell the product by choosing very old, very bad operating systems. Choosing all operating systems for the computer tier will allow you to sell to 100% of the market.
Then you have to balance innovation, stability and usability:
Innovation controls how long the product will sell for, since more innovative software is interesting for longer.
Stability controls how many bugs the product will have and how many skill points your staff will get from working on it, since stability requires a lot of thought.
Usability controls how popular your company gets from releasing the product, since usability increases the user experience.
Finally, each product has its own needs, a game requires a Compiler, a Visual Tool, an Audio Tool and a Game Engine. You have to pick a product for each of these, which will control your products quality and how much you have to pay in license fees. Picking your own products will allow you to avoid license fees. Picking a lower tier product for a need will diminish the quality, so don’t pick a MIDI Editor for a AAA Game.
Software Inc. simulates the market for 10 years before a game starts, so you’ll have a lot of products to pick from. Hopefully, before early access, there will be an event based market on top of the simulation, so that you can edit exactly what companies spring up, which products they release and when. In this way you can have scenarios/missions like: “Buy out EA within 30 years”.
When you want to hire a new employee you pick a role you want to look for and how long you want to look. Your company reputation and the amount of time you wait will determine how many applicants you get. When the searching period is up or you decide to stop looking, a window will pop up with applicants and their level of education in the chosen role. Here you can use money to remove the 10 worst, like with an employment agency, and you can pay to interview each employee individually, which will reveal all their stats.
Lead(Can research tiers and motivate team)
Designer(Makes design document)
Programmer(Writes alpha code, supports releases and fixes bugs)
Artist(Makes art for alpha)
Marketer(Handles software marketing)
Any employee that is not a Lead can be set to take any job other than Lead.
Releasing a product is a lot of risk, since you have to support and market it yourself. In the beginning of the game, it might make more sense to take on small jobs that have a guaranteed pay when you’re done. Introducing Contracts!
A Contract will have requirements with regards to total development time and quality. When you sign a contract you will get a small amount of money upfront. When you’re done, depending on whether you met the requirements, you will either receive a lot of money or pay a fine. Each bug the final product has will also issue a small fine.
As a gamer, I’m not particularly interested in superficial customization in games; I like making houses in The Sims, but I don’t care for picking wallpaper and carpets. But since I’ve already added the actual building aspect, that level of customization seemed mandatory.
Marketing is pretty straight forward. If you pay a lot in a short amount of time, you will gain the same awareness as paying a little for a long amount of time. Advertisements creates more awareness, but only at one single point in time.
This week, wanting to mix things up, I decided to focus on some superficial random generation. Always fun! So I worked on a random name generator, that I will be using to generate company and product names for the competitors in Software Inc. and an employee generator, which basically means I colorize and combine faces/hair/jackets/pants in to one texture, so that each employee looks a little unique.
The employee style generator, or creepy-on-the-fly generator, is basically a quick shader I wrote for Unity (which can be downloaded here) which starts with a base color, which is the skin color, and then adds layers on top of the base color, each layer being colorized individually. Specifically, the layers I add are textures for the face, hair, jacket (or blouse or what have you) and pants, and each of them has an alpha channel, so that they don’t overwrite the previous layer. I then have a class which keeps track of all the textures for each group and assigns them randomly.
The texture class also has Gradients for the skin, hair, jacket and pants to determine which colors can be used to colorize the textures and, effectively, which colors are more likely, by how much space they take up in the gradient. Gradients in Unity are extremely cool and allow you to visually edit color gradients to use directly in your scripts, I really recommend that you try them out!
The generator is far from finished. If I get someone competent to model the employee, I hope to use BlendShapes to morph the model between skinny/obese and woman/man. Currently, there are only male looks, not because I’m being sexist, but female hair is just harder to model and texture.
My random name generator uses a tree like structure to generate random strings of words. A generator can be loaded from a file with a very simple structure, eg.
Will create a generator that can generate the strings: Hello
It works by starting from the first node start (nodes are the ones with a hyphen in front of the name), it appends a random string from the list of strings below it (in this case there’s nothing to pick), it then picks a random node from the parenthesis of the current node (which can only be base in this case), and then it continues until it reaches the node stop.
I then have a generator for each type of software and for the companies. It’s a very simple algorithm, and as you can see in the picture above, the results can be pretty dumb, in a good way. The source can be downloaded here.
So for this update I reworked the GUI style so that it isn’t completely obvious this game was made with Unity, I’m not sure if it looks any better. I implemented a bar chart, I was really hoping there was a library for Unity similar to the System.Drawing.Graphics in .NET, so that I could draw the graph to a texture using all sorts of shapes and line styles and then draw that texture to screen. I ended up just using GUIStyles and the unity GUI system, I lose the ability to draw fancy lines and geometry and the chart has to be redrawn every frame.
I refined the development cycle and added delays and bugs. I decided that marketing is a separate “work-item” on par with the design document, the alpha and such. Basically, to market a product you assign a team to do the marketing, as you would when developing a product. There are two types of marketing: Advertisements and press relations. With advertisements your product gains a lot of attention when the marketing is done and with the press, your product gains attention while the marketing is in progress. When you start a marketing work item you decide how long it will last for and how much money you want to spend.
Currently, you can only market products that are released, and products slowly loose the ability to generate income over time, so if you haven’t gained 100% attention at day one, you will be loosing a lot of money. So, I need to find a way to enable marketing for a product before it it has been released, because currently the marketing work items need instantiated products, but products only get instantiated when they are released and before that, they are work items. So, it looks like I might have to refactor some things.
Finally, I did a lot of work on the graphics-side of things, other than enabling shadows, which is apparently a thing in the free version of Unity now, I modelled, rigged and animated the employees.
The employees look horrible and I hope to find an artist to redo them at some point. My plan is to use blendshapes to have the model dynamically change between woman/man and skinny/obese and then having the texture for their clothes, hair and face randomly generated. Normally you would probably model the clothes and make blendshapes or bones for the facial features, but I want the game to be pretty simplistic graphically and I think textures will do. I would rather have less graphical fidelity with a timeless design than going all-out on graphics and having it look comparatively ugly in a couple of years.
So, for this week I got a lot of the UI done, which is obviously using the Unity GUI system. Unity Technologies recently announced a switch to a better GUI system in the upcoming release, so it’s going to suck pretty hard redoing the entire GUI when the time comes, but I’m sure it’ll be worth it.
I also finally implemented some of the development cycle. You can now choose what type of software you want to release, how much you want to focus on innovation, stability and usability, pick a team to design it, then promote it to alpha and release it when its done.
In the final version there will be delays at the end of the alpha, depending on how competent your employees are, a beta phase of fixing as many of the bugs as possible and after release you will have to take care of marketing and assign a team to support customers and fix bugs, or get a bad reputation. All of these steps will be affected by many factors, which includes how good your employees are and how well they are doing.
When you release a product, its quality, compared to similar items on the market, will have an effect on how well it sells. So, if you release a 3D modeling application right as another company has released a much better one, yours will sell less, but you can use it on your next game without having to buy a license. I use a large amount of variables when calculating how much your product will sell each month and how much popularity it generates.
Finally, I simulated winter. It seems like a good way to illustrate time passing, though the snow texture and particle effect could use a loving hand.
For this week of development I had a lot to implement to get to a point where I wasn’t just going to abandon the project. I expanded the AI of the employees (more on that later), I implemented stuff like hunger, energy and satisfaction. I also strayed from the blocky look by making the walls thin, which required making corner walls and dealing with all sorts of z-fighting issues, which eventually culminated in a convoluted algorithm that rebuilds all rooms on a floor when you change something, and merges all the walls, windows and doors in to one big mesh.
I also implemented meetings. I work as a student programmer and we have meetings once a week, and they’re always very interesting, I learn something new and I get motivated. I wanted to recreate that in Software Inc. by giving boosts for a team if they’re in a meeting, which requires a team leader setting them up, and tables and chairs to sit in.
It took me some time to decide how tables and chairs should be implemented. I ended up with a solution which determines which tables are touching and groups them together. Chairs can only be added to tables and will be added to the group the table belongs to and when a leader wants to use a table group, the room finds the largest available one. And finally I started modelling furniture, as seen below, I am NOT a 3D modeller.
I also felt like I had to implement the ability to choose working hours for each team individually so the game doesn’t get boring between 4 PM and 8 AM.
After more than 12 years of developing games in my spare time, I finally managed to stick to one project for longer than a couple of weeks and I really think it’s looking promising.
The kicker for me in actually keeping my motivation, I think, was having a large detailed todo-list of everything that needs to be done in order to make the game playable. I’ve tried this before, but I usually slack a lot in keeping it updated. I’ve found that dedicating some time for cleaning the list and elaborating on points has helped keep up the motivation and I always have an idea of what to do if I get bored. I really can’t overstate how important this has been and if you’re into game development, I recommend that you try always having clearly defined tasks waiting to be completed.
I’ve been thinking about creating this game for quite a while now. I first started developing a school tycoon game, but realized all the action happened once a year when the it was grading time, the rest of the time was spent waiting. I then tried developing a 2D version of what I am making now, but I got stumped on some technical issues. Then I had a sudden burst of inspiration for a pathfinding algorithm and it motivated me to start again in 3D.
I was also hugely inspired by Game Dev Tycoon and I felt there were so many possibilities to go more in-depth with the software tycoon game idea. With Software Inc., my goal is to go more in-depth when it comes to the development cycle, the buildings and staff management. I want you to not just push out virtual products to gain some points in a game, but also feel like there’s an entire ecosystem just below the surface, that you have to manage.
When these pictures were taken I had implemented rooms, doors, elevators and lamps to create buildings with. I also had an employee type person, who would turn up once a day to sit at a desk/box, to test the pathfinding algorithm.