/* 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 "level.h" #include "conf.h" #include "lazyint.h" #include "player.h" #include "tiles.h" #include "vec2.h" #include #include extern bopti_image_t bimg_tileset; void level_draw(Level level, i16 y_offset) { const int tileset_width = bimg_tileset.width / TILE_SIZE; /* Pixel position (where we draw). */ i32 x = DRAW_OFFSET_X; i16 y = y_offset; /* Cursor position. */ u8 cx = 0; while (cx < LEVEL_WIDTH) { u8 cy = 0; while (cy < LEVEL_HEIGHT) { const tile_t tile = level.content[cy * LEVEL_WIDTH + cx]; dsubimage(x, y, &bimg_tileset, (int)(tile % tileset_width) * TILE_SIZE, (int)(tile / tileset_width) * TILE_SIZE, TILE_SIZE, TILE_SIZE, DIMAGE_NOCLIP); y += TILE_SIZE; cy += 1; } y = y_offset; x += TILE_SIZE; cx += 1; } } void level_load(Level *level, Player *player, u8 id) { extern Level levels[LEVEL_SIZE]; memcpy(level->content, levels[id].content, LEVEL_SIZE); level->start_pos = levels[id].start_pos; level->keys = levels[id].keys; player_init(player); player->pos = levels[id].start_pos; player->keys_left = levels[id].keys; } tile_t level_get_tile_at_px(Level level, Vec2 pos) { /* Out of bounds check. */ if (pos.x < 0 || pos.y < 0) return OUT_OF_BOUNDS; /* Convert to unsigned integers. */ u8 x = pos.x / TILE_SIZE; u8 y = pos.y / TILE_SIZE; /* Out of bounds check. */ if (pos.x >= LEVEL_WIDTH_PX || pos.y >= LEVEL_HEIGHT_PX) return OUT_OF_BOUNDS; /* If everything is OK, get the tile and return it. */ return level.content[x + y * LEVEL_WIDTH]; } void level_set_tile_at_px(Level *level, Vec2 pos, tile_t tile) { /* Convert to unsigned integers. */ u8 x = pos.x / TILE_SIZE; u8 y = pos.y / TILE_SIZE; level->content[x + y * LEVEL_WIDTH] = tile; }