#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); g_at.rt.flags = PKE_AT_RUNTIME_FLAG_NONE; } void pke_at_level_main_tick(double delta) { if (!PK_HAS_FLAG(g_at.rt.flags, PKE_AT_RUNTIME_FLAG_PLAYING)) { return; } if (PK_HAS_FLAG(g_at.rt.flags, PKE_AT_RUNTIME_FLAG_PAUSED)) { return; } 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; }