This commit is contained in:
2025-06-08 17:22:30 +02:00
parent 64cac7578d
commit 79c8b747cd
16 changed files with 686 additions and 79 deletions

115
main.c
View File

@@ -9,6 +9,7 @@
#include "player/player.h"
#include "util/perlin.h"
#include "util/atlas.h"
#include "entity/entity.h"
typedef struct GameState {
Player player;
@@ -16,6 +17,9 @@ typedef struct GameState {
BackgroundTile backgroundTileMap[MAP_HEIGHT][MAP_WIDTH];
AudioData audioData;
TileArray neededUpdates;
EntityArray entities;
Node openList[MAX_OPEN_NODES];
int openCount;
} GameState;
GameState gameState;
@@ -40,6 +44,9 @@ int loadGameState(char *filename, Player *plr) {
audioData.playerRect = tmp;
audioData.totalSamples = 0;
memcpy(&neededUpdates, &gameState.neededUpdates, sizeof(gameState.neededUpdates));
memcpy(&entities, &gameState.entities, sizeof(gameState.entities));
openCount = gameState.openCount;
memcpy(&openList, &gameState.openList, sizeof(gameState.openList));
plr->cursor.targetTile = NULL;
plr->cursor.prevTargetTile = NULL;
return 0;
@@ -53,6 +60,9 @@ void saveGameState(char *filename, Player *plr) {
memcpy(gameState.backgroundTileMap, backgroundMap, sizeof(gameState.backgroundTileMap));
memcpy(&gameState.audioData, &audioData, sizeof(gameState.audioData));
memcpy(&gameState.neededUpdates, &neededUpdates, sizeof(neededUpdates));
memcpy(&gameState.entities, &entities, sizeof(entities));
memcpy(&gameState.openList, &openList, sizeof(openList));
gameState.openCount = openCount;
FILE *gameSave = fopen(filename, "wb");
if (!gameSave) {
@@ -142,6 +152,20 @@ int init() {
loadBackgroundTiles(mainRenderer);
loadTiles(mainRenderer);
loadItems(mainRenderer);
loadEntities(mainRenderer);
Entity entTest;
memset(&entTest, 0, sizeof(Entity));
entTest.tileRect.x = 4;
entTest.tileRect.y = 5;
entTest.renderRect.w = TILE_SIZE;
entTest.renderRect.h = TILE_SIZE;
entTest.target.x = 0;
entTest.target.y = 0;
entTest.health = 100;
entTest.type = GHOST;
add_entity(&entities, entTest);
setupTiles();
// for (ItemType i = 0; i < ITEMREGISTRY_SIZE; i++) {
@@ -226,6 +250,7 @@ int render() {
rect2.h = ATLAS_SIZE;
renderAllTiles(mainRenderer, player.rect);
renderEntities(mainRenderer, player.rect);
renderPlayer(&player);
@@ -333,6 +358,7 @@ void processMousePosition() {
if (player.inventory.slotCounts[player.inventory.activeSlotIndex] > 0) {
player.inventory.slotCounts[player.inventory.activeSlotIndex]--;
player.cursor.targetTile->type = player.inventory.activeSlotIndex;
player.cursor.targetTile->health = TileRegistry[player.inventory.activeSlotIndex].maxHealth;
player.cursor.targetTile->rect.x = player.cursor.tileX;
player.cursor.targetTile->rect.y = player.cursor.tileY;
if (TileRegistry[player.inventory.activeSlotIndex].needsTicks) {
@@ -431,46 +457,53 @@ void processKeyboardHeld() {
cameraSpeed /= 2;
}
if (player.cursor.breakingProgress == 0) {
if (keyboardState[SDL_SCANCODE_W]) {
// Example: move up
player.rect.y -= cameraSpeed;
// if (player.rect.y < (DISPLAY_HEIGHT / 2)) {
// player.rect.y = (DISPLAY_HEIGHT / 2);
// }
if (player.rect.y < 0) {
player.rect.y = 0;
}
}
if (keyboardState[SDL_SCANCODE_S]) {
player.rect.y += cameraSpeed;
// if (player.rect.y > (MAP_HEIGHT * TILE_SIZE) - (DISPLAY_HEIGHT / 2)) {
// player.rect.y = (MAP_HEIGHT * TILE_SIZE) - (DISPLAY_HEIGHT / 2);
// }
if (player.rect.y > (MAP_HEIGHT * TILE_SIZE)) {
player.rect.y = (MAP_HEIGHT * TILE_SIZE);
}
}
if (keyboardState[SDL_SCANCODE_A]) {
player.rect.x -= cameraSpeed;
// if (player.rect.x < (DISPLAY_WIDTH / 2)) {
// player.rect.x = (DISPLAY_WIDTH / 2);
// }
if (player.rect.x < 0) {
player.rect.x = 0;
}
}
if (keyboardState[SDL_SCANCODE_D]) {
player.rect.x += cameraSpeed;
// if (player.rect.x > (MAP_WIDTH * TILE_SIZE) - (DISPLAY_WIDTH / 2)) {
// player.rect.x = (MAP_WIDTH * TILE_SIZE) - (DISPLAY_WIDTH / 2);
// }
if (player.rect.x > (MAP_WIDTH * TILE_SIZE)) {
player.rect.x = (MAP_WIDTH * TILE_SIZE);
}
if (keyboardState[SDL_SCANCODE_F8]) {
if (player.cursor.targetTile->health) {
player.cursor.targetTile->health--;
}
}
if (player.cursor.breakingProgress == 0) {
SDL_Rect newRect = player.rect;
if (keyboardState[SDL_SCANCODE_W]) {
newRect.y -= cameraSpeed;
if (newRect.y >= 0 && canMoveWithRadius(newRect)) {
player.rect = newRect;
}
}
if (keyboardState[SDL_SCANCODE_S]) {
newRect = player.rect;
newRect.y += cameraSpeed;
if (newRect.y + newRect.h <= MAP_HEIGHT * TILE_SIZE && canMoveWithRadius(newRect)) {
player.rect = newRect;
}
}
if (keyboardState[SDL_SCANCODE_A]) {
newRect = player.rect;
newRect.x -= cameraSpeed;
if (newRect.x >= 0 && canMoveWithRadius(newRect)) {
player.rect = newRect;
}
}
if (keyboardState[SDL_SCANCODE_D]) {
newRect = player.rect;
newRect.x += cameraSpeed;
if (newRect.x + newRect.w <= MAP_WIDTH * TILE_SIZE && canMoveWithRadius(newRect)) {
player.rect = newRect;
}
}
// Update tileRect only after actual movement
player.tileRect.x = player.rect.x / TILE_SIZE;
player.tileRect.y = player.rect.y / TILE_SIZE;
}
if (keyboardState[SDL_SCANCODE_F]) {
for (int x = playerTileX - 2; x < playerTileX + 2; x++) {
if (x < 0) {
@@ -587,7 +620,10 @@ int main(__attribute__((unused)) int argc, __attribute__((unused)) char *args[])
running = processEvent(e);
}
entities.entities[0].target = player.tileRect;
updateItems();
updateEntities();
updatePlayer(&player);
updateTiles();
animationStep++;
@@ -658,7 +694,7 @@ void genInitMap() {
if (oreNrm > oreNrmMax) oreNrmMax = oreNrm;
// [Same as your original terrain generation logic...]
BackgroundType baseType;
BackgroundType baseType = BGType_COBBLE0;
if (terrain < 0.30) {
baseType = (humidity < 0.5) ? BGType_WATER_SHALLOW : BGType_WATER_DEEP;
} else if (terrain < 0.35) {
@@ -694,6 +730,9 @@ void genInitMap() {
}
}
if (finalType > BGType_END) {
finalType = BGType_COBBLE0;
}
backgroundMap[y][x].type = finalType;
}
}