/** * 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); }