painfull-success-cg/src/level.c

81 lines
2.1 KiB
C
Raw Normal View History

2021-03-02 11:17:40 +01:00
/* 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. */
2021-03-02 00:44:58 +01:00
#include "level.h"
#include "conf.h"
2021-05-01 02:23:11 +02:00
#include "lazyint.h"
#include "player.h"
2021-05-01 02:23:11 +02:00
#include "tiles.h"
#include "vec2.h"
2021-05-01 02:23:11 +02:00
#include <gint/display.h>
#include <gint/std/string.h>
2021-03-02 00:44:58 +01:00
extern bopti_image_t bimg_tileset;
2021-05-01 02:23:11 +02:00
void
level_draw(Level level, i16 y_offset)
{
const int tileset_width = bimg_tileset.width / TILE_SIZE;
2021-03-02 00:44:58 +01:00
/* Pixel position (where we draw). */
i32 x = DRAW_OFFSET_X;
i16 y = y_offset;
2021-03-02 00:44:58 +01:00
/* Cursor position. */
2021-03-04 10:38:50 +01:00
u8 cx = 0;
2021-03-02 00:44:58 +01:00
while (cx < LEVEL_WIDTH) {
2021-03-04 10:38:50 +01:00
u8 cy = 0;
2021-03-02 00:44:58 +01:00
while (cy < LEVEL_HEIGHT) {
2021-05-01 02:23:11 +02:00
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);
2021-03-02 00:44:58 +01:00
y += TILE_SIZE;
cy += 1;
}
y = y_offset;
2021-03-02 00:44:58 +01:00
x += TILE_SIZE;
cx += 1;
}
}
2021-05-01 02:23:11 +02:00
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;
2021-03-04 18:21:03 +01:00
level->keys = levels[id].keys;
player_init(player);
player->pos = levels[id].start_pos;
2021-03-04 18:21:03 +01:00
player->keys_left = levels[id].keys;
}
2021-05-01 02:23:11 +02:00
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. */
2021-03-04 10:38:50 +01:00
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];
}
2021-05-01 02:23:11 +02:00
void
level_set_tile_at_px(Level *level, Vec2 pos, tile_t tile)
{
/* Convert to unsigned integers. */
2021-03-04 10:38:50 +01:00
u8 x = pos.x / TILE_SIZE;
u8 y = pos.y / TILE_SIZE;
level->content[x + y * LEVEL_WIDTH] = tile;
}