/* SPDX-License-Identifier: MIT * Copyright (c) 2021 KikooDX * This file is part of * [Painfull Success CG](https://git.sr.ht/~kikoodx/painfull-success-cg), * which is MIT licensed. The MIT license requires this copyright notice to be * included in all copies and substantial portions of the software. */ #include "conf.h" #include "input.h" #include "lazyint.h" #include "level.h" #include "player.h" #include #include #include #include int callback(volatile int *arg) { *arg = true; return 0; } int main(void) { /* Initialize player. */ Player player; player_init(&player); /* Initialize level. */ Level level = (Level){}; u8 level_id = 0; level_load(&level, &player, level_id); /* Initialize input. */ Input input = (Input){}; input_init(&input); /* Initalize y offset. */ i16 y_offset = DRAW_OFFSET_Y_DEFAULT; /* UPS control. */ volatile int has_ticked = true; int timer = timer_configure(TIMER_ANY, 1000000 / TARGET_UPS, GINT_CALL(callback, &has_ticked)); timer_start(timer); /* Core loop. */ while (!input_is_down(input, K_EXIT)) { /* Repeat step event so the UPS is constant. */ for (u8 i = 0; i < TARGET_UPS / TARGET_FPS; i += 1) { /* UPS control. */ while (!has_ticked) sleep(); has_ticked = false; /* Update. */ input_update(&input); player_update(&player, &level, input, &level_id); /* Y offset. */ if (input_is_pressed(input, K_CAM_UP) && y_offset < DRAW_OFFSET_Y_MAX) y_offset += DRAW_OFFSET_Y_STEP; if (input_is_pressed(input, K_CAM_DOWN) && y_offset > DRAW_OFFSET_Y_MIN) y_offset -= DRAW_OFFSET_Y_STEP; } /* Draw. */ dclear(C_BLACK); level_draw(level, y_offset); player_draw(player, y_offset); /* Black borders. */ drect(0, 0, DRAW_OFFSET_X - 1, DHEIGHT, C_BLACK); drect(DRAW_OFFSET_X + LEVEL_WIDTH_PX, 0, DWIDTH, DHEIGHT, C_BLACK); dupdate(); } return 1; }