72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
/**
|
|
* Copyright (c) 2025 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "overworld.h"
|
|
#include "chunk.h"
|
|
#include "display/render.h"
|
|
#include "assert/assert.h"
|
|
#include "entity/entity.h"
|
|
|
|
uint32_t OVERWORLD_CAMERA_X;
|
|
uint32_t OVERWORLD_CAMERA_Y;
|
|
overworldcameratype_t OVERWORLD_CAMERA_TYPE;
|
|
|
|
void overworldInit(void) {
|
|
playerInit();
|
|
chunkMapInit();
|
|
|
|
OVERWORLD_CAMERA_X = 0;
|
|
OVERWORLD_CAMERA_Y = 0;
|
|
OVERWORLD_CAMERA_TYPE = OVERWORLD_CAMERA_TYPE_CENTERED_POSITION;
|
|
}
|
|
|
|
void overworldUpdate() {
|
|
entity_t *entity;
|
|
|
|
assertTrue(
|
|
OVERWORLD_CAMERA_X < OVERWORLD_CAMERA_LIMIT_X,
|
|
"Camera position limit (just because I haven't tested properly)"
|
|
);
|
|
assertTrue(
|
|
OVERWORLD_CAMERA_Y < OVERWORLD_CAMERA_LIMIT_Y,
|
|
"Camera position limit (just because I haven't tested properly)"
|
|
);
|
|
|
|
entity = ENTITIES;
|
|
do {
|
|
entityUpdate(entity++);
|
|
} while(entity->type != ENTITY_TYPE_NULL);
|
|
|
|
// Testing, follow player
|
|
entity = &ENTITIES[0]; // Player entity
|
|
assertTrue(
|
|
entity->type == ENTITY_TYPE_PLAYER,
|
|
"First entity must be player"
|
|
);
|
|
OVERWORLD_CAMERA_X = entity->x * TILE_WIDTH_HEIGHT + entity->subX;
|
|
OVERWORLD_CAMERA_Y = entity->y * TILE_WIDTH_HEIGHT + entity->subY;
|
|
|
|
uint16_t x, y;
|
|
uint16_t halfWidth, halfHeight;
|
|
halfWidth = ((CHUNK_MAP_WIDTH - 1) * CHUNK_WIDTH * TILE_WIDTH_HEIGHT) / 2;
|
|
halfHeight = ((CHUNK_MAP_HEIGHT - 1) * CHUNK_HEIGHT * TILE_WIDTH_HEIGHT) / 2;
|
|
|
|
// Calculate the chunk map position based on the camera position.
|
|
if(OVERWORLD_CAMERA_X < halfWidth) {
|
|
x = 0;
|
|
} else {
|
|
x = (OVERWORLD_CAMERA_X - halfWidth) / (CHUNK_WIDTH*TILE_WIDTH_HEIGHT);
|
|
}
|
|
|
|
if(OVERWORLD_CAMERA_Y < halfHeight) {
|
|
y = 0;
|
|
} else {
|
|
y = (OVERWORLD_CAMERA_Y - halfHeight) / (CHUNK_HEIGHT*TILE_WIDTH_HEIGHT);
|
|
}
|
|
|
|
chunkMapSetPosition(x, y);
|
|
} |