# Space Shooter “level” generation

I'm currently working on a 2.5D space shooter and there will be a survival mode in the game. I'd like a few suggestions on how to tackle the enemy generation problem. This is not procedural generation at all, it's more like a sequence generation. The characteristics the system needs to have are:

1. Increasing difficulty based on time
2. Ability to use enemy patterns as input and not only single enemies
3. It has to be beatable, it's quite easy to make a wall of thousand of enemies :)

I'm not looking for a fully-optimized, ready to use algorithm, just some suggestions or links to papers or articles. I have found many resources on procedural generation, but nothing that can be applied to this game genre. The game is 2.5D but the level will be generated as it was 2D, in addition it's not omnidirectional, it will scroll in only one way (this should make the task easier).

• If you have a 'bomb' ability/powerup/whatever which has limited uses but clears the whole screen, up to [numofbombs] 'walls of enemies' can be used. Ofc, the number needs to be smaller for easier difficulties, but could be much larger for 'unfair++' difficulty ;) – Exilyth Apr 19 '13 at 11:27
• Here is an article that may help: en.wikipedia.org/wiki/Dynamic_game_difficulty_balancing – amb Apr 19 '13 at 12:28
• – amb Apr 19 '13 at 12:35

What I have done in the past is to have a single value to represent difficulty of each wave:

float wave_difficulty = START_WAVE_DIFFICULTY;


then every wave:

generateWave(wave_difficulty);
wave_difficulty += DELTA_WAVE_DIFFICULTY;


The hard part is taking the value and building a wave based on it in a fair and balanced way. Here are some ideas.

• number of enemies
• frequency at which enemies come
• total health of enemies
{"extraction_info": {"found_math": true, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 0, "mathjax_tag": 0, "mathjax_inline_tex": 0, "mathjax_display_tex": 0, "mathjax_asciimath": 1, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0, "katex": 0, "math-container": 0, "wp-katex-eq": 0, "align": 0, "equation": 0, "x-ck12": 0, "texerror": 0, "math_score": 0.20492948591709137, "perplexity": 1387.542262695579}, "config": {"markdown_headings": true, "markdown_code": true, "boilerplate_config": {"ratio_threshold": 0.18, "absolute_threshold": 10, "end_threshold": 15, "enable": true}, "remove_buttons": true, "remove_image_figures": true, "remove_link_clusters": true, "table_config": {"min_rows": 2, "min_cols": 3, "format": "plain"}, "remove_chinese": true, "remove_edit_buttons": true, "extract_latex": true}, "warc_path": "s3://commoncrawl/crawl-data/CC-MAIN-2019-26/segments/1560627999838.23/warc/CC-MAIN-20190625112522-20190625134522-00548.warc.gz"}