# Gameplay

## Witches

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.

## Modes

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)

## Powerups

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

## Objects

`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.
