A remake of classic shot'em'up, bullet hell, Touhou games. Also a PoC of gint performances
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Darks 9ca4fd1d37
2 years ago
assets-cg Updated assets 2 years ago
assets-fx Trying to be original in this first commit msg. Joking 2 years ago
assets-raw Trying to be original in this first commit msg. Joking 2 years ago
include WIP 2 years ago
src WIP 2 years ago
.gitignore Updated .gitignore & cleaned build directory 2 years ago
Makefile Updated assets 2 years ago
Readme.md Added Readme 2 years ago
Touhou.g3a Worked on some tests. 2 years ago
assets.py Work on assets. Updated icon 2 years ago
project.cfg Updated assets 2 years ago




Before the game starts, the player can choose two witches between the 8 available. The first one is used on normal mode, the second on focused mode. Each witch has unique properties and sometimes a special effect.


There are two gameplay modes:

  1. Normal
  2. Focused

The "focus" mode is triggered by pressing KEY_OPTN. The effect disapears when the key is released. Focus mode with speed divided by two, some bullets are ineffective, and usually a fire power focused on a single stream. They may have a special effect

Speeds are in px/s (play area is 270×224).

Id Name Spe Pow Special
0 Reimu Hakurei 194 130 +10% power when focused
1 Marisa Kirisame 208 130 Attract bonus when on top of the screen
2 Sariel 241 Do not attract bullets when not focused
3 Koakuma +15% chance of getting a powerup
4 Iku Nagae Start with 4 bombs instead of 3
5 Sumireko Usami Wider fire angle when not focused
6 Hina Kagiyama +10% power when not focused
7 Kurumi

Power & fire

Power can go from 1 to

A bullet_t is always launched by the player. Else it's an enemy_t (even if it's an enemy bullet)


There are 2 kinds of powerups: small ones and big ones. Small ones increase power by 1, big ones by 5.

Code architecture

Global vars

  • uint32_t us_elapsed: μs elapsed during the last frame
  • uint32_t frame: number of frames elapsed since the beginning of the game
  • player_t *player: general information about player
  • difficulty_t difficulty: the chosen difficulty of the game
  • bullet_t *bullets: the bullets sent by player


object_t is an object linked to physic or an updater. This means that an enemy as well as a bullet can be objects.

Object updater

An object updater is a function applied to an object. Its protoype must follow this: void f(object_t*). Due to the complexity of the game, it may use frame, us_elapsed; but it could also use player, difficulty or other global variables.