summaryrefslogtreecommitdiff
path: root/src/level-main.cpp
blob: 26618e40f2e3b5c9ba9ecf5c824dd1da587d4dd1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

#include "level-main.hpp"

#include "pke-at-common.hpp"
#include "pke-at-settings.hpp"
#include "pke/audio-types.hpp"
#include "pke/audio.hpp"
#include "pke/level.hpp"

struct pke_level_main_master {
	pke_level *level;
} main_mstr;

pke_level *pke_at_level_main_create() {
	main_mstr.level = pke_level_create("main", pk_uuid_zed, pk_uuid_zed);
	main_mstr.level->pke_cb_spinup.func = pke_at_level_main_init;
	main_mstr.level->pke_cb_tick.func = (void(*)())pke_at_level_main_tick;
	main_mstr.level->pke_cb_teardown.func = pke_at_level_main_teardown;
	return main_mstr.level;
}

void pke_at_level_main_init() {
	pke_ui_box *hello_world = pke_ui_box_new_root();
	hello_world->flags |= PKE_UI_BOX_FLAG_POSITION_TYPE_DYNAMIC;
	hello_world->flags |= PKE_UI_BOX_FLAG_CENTER_BOTH;
	hello_world->min_size = glm::vec2(0.9);
	hello_world->max_size = glm::vec2(0.9);
	pke_level_register_root_ui_box(main_mstr.level, hello_world);
	pke_at_bpm_reset(120);
	g_at.mtrnm.beep = pke_at_audio_get_or_generate_sawtooth(440.f, 0.30);
	g_at.mtrnm.beep_accent = pke_at_audio_get_or_generate_sawtooth(440.f * (3/2.f), 0.30);
	pke_audio_set_volume(pke_audio_source_sfx, 0.25);
}

void pke_at_level_main_tick(double delta) {
	(void)delta;
	g_at.bpm.delta_since_last_beat += delta;
	if (g_at.bpm.lerp_delta <= g_at.bpm.lerp_delta_duration) {
		g_at.bpm.lerp_delta += delta;
		g_at.bpm.current = std::lerp(g_at.bpm.last, g_at.bpm.target, g_at.bpm.lerp_delta / g_at.bpm.lerp_delta_duration);
	} else {
		g_at.bpm.current = g_at.bpm.target;
	}
	g_at.bpm.delta_per_beat = 60.f / g_at.bpm.current;
	g_at.bpm.delta_since_last_beat += delta;
	if (g_at.bpm.delta_since_last_beat >= g_at.bpm.delta_per_beat) {
		if (g_at.mtrnm.beat == 0) {
			pke_audio_play(g_at.mtrnm.beep_accent, pke_audio_source_sfx, pke_audio_flag_none);
			fprintf(stdout, "beat accent %f\n", delta);
		} else {
			pke_audio_play(g_at.mtrnm.beep, pke_audio_source_sfx, pke_audio_flag_none);
			fprintf(stdout, "beat %f\n", delta);
		}
		g_at.bpm.delta_since_last_beat = std::fmod(g_at.bpm.delta_since_last_beat, g_at.bpm.delta_per_beat);
		g_at.mtrnm.beat += 1;
		g_at.mtrnm.beat %= g_at.mtrnm.beats_per_bar;
	}
}

void pke_at_level_main_teardown() {
	main_mstr.level = nullptr;
}