Long time with no posts or updates here. It seems like desert, sorry for that but I am sure people who follow me on twitter knows I was busy with my Master’s Thesis in Procedural Content Generation (PCG). I have always used PCG in my games as an excuse for being lazy and not designing levels (as I am not amazing level designer). In this post I will wrap up quickly some of the PCGs I used in my games. In the next post will talk about PCG in my Master’s Thesis.
As most of people noticed lots of my arcade games used PCG especially top down shooters (Clean’Em Up and Alone in the Park). All these games don’t have levels designed in advance, but instead they have enemy numbers and types to be generated. The system afterwards choose the most suitable location (away from the player position) and insert them. Pace Maker was a little different where the system generates the types and numbers based on the level of difficulty so as difficulty increase the number of enemies and variety of types increased.
- Insert random tiles (numbers and types) over the whole grid
- Choose the solution length based on the player score (define the difficulty).
- Generate a random path of the specified length without any loops.
- Calculate the value of this path and consider it as player target
For the puzzle mode instead of generating paths, the whole playground is divided into sets according to the number of sets required at the beginning and then calculate the value of each set separately.
- Bullet Path (bp): how the bullet moves in the game (straight line, sin wave, spring, and circular path).
- Number of Spawner (ns): how many places bullets should fire from the center (1, 2, 3, and 4).
- Rate of Spawning (rs): how many milliseconds does the spawner need to spawn a bullet (800, 750, 700, 650, and 600).
- Number of Burst bullets (nbb): how many bullets should the spawner generate at everyshot (1, 2, and 3).
- Number of Bullets (nb): how many bullets the spwaner should shoot after each other (1, 2, and 3).
- Spawner movement (sm): how the spawner update its position (no movement, circular movement, and ping pong circular movement)
Each of values for each feature has a specific difficulty score. This score is inserted in a difficulty equation and if the output difficulty is near the target difficulty then this generator is used else repick another random generator. The difficult equation is:
Last game I am going to talk about is DivCircle. The music and the rotation are both chosen by the computer. For the game music. The music is divided into several tracks overlayed over each other as the rotation speed increased each layer of the music got activated and as the rotation speed decrease the layers gets lower. Also as the player approach more towards the death, all layers volume decreased while sounds of talking people increases. That’s everything with the music and Ben Burnes did an amazing job in helping me to reach that. About the rotations, I divided the game into 14 sequence each one with its own difficulty score. These sequences are:
- Speed Up
- Speed Up Fast
- Slow Down
- Slow Down Fast
- Speed Reverse
- Slow Reverse
- Reverse, Reverse
- Speed Up Fast, Speed Up Fast, Slow Down Fast
- Slow Down Fast, Speed Up Fast
- Speed Reverse, Slow Down Fast, Speed Reverse
- Reverse, Speed Up Fast, Reverse, Slow Down, Reverse
- Speed Up Fast, Speed Up Fast, Reverse
- Speed Reverse, Slow Reverse, Speed Reverse
All actions are stored in a queue and every amount of time an action is activated and new action sequence is inserted in the list based on the current player score and current rotation speed and how old is the reverse. The amount of time for inserting and applying new action is decreased as the score increase.
This is everything for now, Hope its a little bit entertainment and useful. Stay tuned for the next post which is gonna be about General Level Generation for Puzzle Script (which is a part of my Master’s Thesis).
Bye Bye for now