summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-01-19 20:42:57 +0500
committerilotterytea <iltsu@alright.party>2025-01-19 20:42:57 +0500
commit3fa74d5844e441f0cccf711791066efaab054b63 (patch)
tree2a3f95088e49deba37963c16928d830373899146
parent8bc01fccc138461f3bd58cd9d2707309fe745a43 (diff)
feat: save/load .xd files (wip)
-rw-r--r--src/editor.c8
-rw-r--r--src/editor.h5
-rw-r--r--src/main.c28
-rw-r--r--src/screens.c45
-rw-r--r--src/screens.h9
-rw-r--r--src/xd.c11
-rw-r--r--src/xd.h2
7 files changed, 83 insertions, 25 deletions
diff --git a/src/editor.c b/src/editor.c
index 64f1673..65f6a32 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -1,13 +1,17 @@
#include "editor.h"
#include "raylib.h"
+#include "xd.h"
void SE_DrawEditor(Editor *editor, Camera2D *camera) {
Vector2 mousePos = GetScreenToWorld2D(GetMousePosition(), *camera);
float zoom = camera->zoom;
- for (int x = 0; x < editor->level->width; x++) {
- for (int y = 0; y < editor->level->height; y++) {
+ XdLevel *level = editor->data->levels[editor->state.currentLevel];
+ XdFloor *floor = level->floors[editor->state.currentLayer];
+
+ for (int x = 0; x < floor->width; x++) {
+ for (int y = 0; y < floor->height; y++) {
float rx = x * zoom, ry = y * zoom;
Color innerColor = RAYWHITE;
Color borderColor = LIGHTGRAY;
diff --git a/src/editor.h b/src/editor.h
index ddd030f..e1981cf 100644
--- a/src/editor.h
+++ b/src/editor.h
@@ -2,13 +2,14 @@
#define __EDITOR_H__
#include <raylib.h>
-#include "level.h"
+#include "xd.h"
typedef struct {
+ int currentLevel, currentLayer;
} EditorState;
typedef struct {
- Level *level;
+ XdData *data;
EditorState state;
} Editor;
diff --git a/src/main.c b/src/main.c
index ad854a8..31a858a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,19 +1,31 @@
#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
#include "editor.h"
-#include "level.h"
#include "raylib.h"
#include "screens.h"
-
-typedef enum GameScreen { SCREEN_MENU = 0, SCREEN_EDITOR } GameScreen;
+#include "xd.h"
int main() {
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
InitWindow(800, 600, "sillyeditor");
SetTargetFPS(60);
- Level *level = SE_CreateLevel(30, 30);
- Editor editor = {level, {}};
+ // Getting list of files
+ XdData* datas[] = {};
+ FilePathList list = LoadDirectoryFilesEx("datas", ".xd", true);
+
+ for (int i = 0; i < list.count; i++) {
+ XdData data = Xd_LoadFromFile(list.paths[i]);
+ printf("%s\n", data.name);
+ datas[i] = &data;
+ }
+
+ UnloadDirectoryFiles(list);
+
+ XdData* data = NULL;
+ Editor editor = {data, {0, 0}};
Camera2D camera = {0};
camera.target = (Vector2){0.0f, 0.0f};
@@ -26,11 +38,11 @@ int main() {
while (!WindowShouldClose()) {
switch (currentScreen) {
case SCREEN_MENU: {
- SE_DrawMenuScreen();
+ SE_DrawMenuScreen(&currentScreen, &editor, data, datas);
break;
}
case SCREEN_EDITOR: {
- SE_DrawEditorScreen(&editor, &camera);
+ SE_DrawEditorScreen(&currentScreen, &editor, &camera);
break;
}
default:
@@ -38,7 +50,5 @@ int main() {
}
}
- SE_FreeLevel(level);
-
return 0;
}
diff --git a/src/screens.c b/src/screens.c
index f7bda99..03b1441 100644
--- a/src/screens.c
+++ b/src/screens.c
@@ -1,15 +1,56 @@
#include "screens.h"
+#include <stdio.h>
+#include <stdlib.h>
+
#include "editor.h"
#include "raylib.h"
+#include "xd.h"
+
+#define RAYGUI_IMPLEMENTATION
+#include "raygui.h"
+
+void SE_DrawMenuScreen(GameScreen *currentScreen, Editor *editor, XdData *data,
+ XdData *datas[]) {
+ if (IsKeyPressed(KEY_N)) {
+ *currentScreen = SCREEN_EDITOR;
+ data = malloc(sizeof(XdData));
+ editor->data = data;
+
+ data->name = "xd";
+
+ // Creating an empty level
+ data->levels[0] = malloc(sizeof(XdLevel));
+ data->levels[0]->floors[0] = malloc(sizeof(XdFloor));
+ data->levels[0]->floors[0]->width = 30;
+ data->levels[0]->floors[0]->height = 30;
+ }
-void SE_DrawMenuScreen() {
BeginDrawing();
ClearBackground(RAYWHITE);
+
+ for (int i = 0; i < sizeof(*datas) / sizeof(*datas[0]); i++) {
+ printf("xd\n");
+ XdData *data = datas[i];
+ bool button = GuiButton((Rectangle){10, 10 * i, GetScreenWidth() - 10, 40},
+ data->name);
+ }
+
+ GuiLabel((Rectangle){0, GetScreenHeight() - 20, GetScreenWidth(), 20},
+ "Press N to create a new campaign");
EndDrawing();
}
-void SE_DrawEditorScreen(Editor *editor, Camera2D *camera) {
+void SE_DrawEditorScreen(GameScreen *currentScreen, Editor *editor,
+ Camera2D *camera) {
+ if (IsKeyPressed(KEY_S)) {
+ Xd_SaveFile("test.xd", editor->data);
+ *currentScreen = SCREEN_MENU;
+ free(editor->data);
+ editor->data = NULL;
+ return;
+ }
+
if (GetMouseWheelMove() != 0.0) {
camera->zoom += (int)GetMouseWheelMove();
diff --git a/src/screens.h b/src/screens.h
index 75e9616..f73df4e 100644
--- a/src/screens.h
+++ b/src/screens.h
@@ -1,6 +1,11 @@
#include <raylib.h>
#include "editor.h"
+#include "xd.h"
-void SE_DrawMenuScreen();
-void SE_DrawEditorScreen(Editor *editor, Camera2D *camera);
+typedef enum GameScreen { SCREEN_MENU = 0, SCREEN_EDITOR } GameScreen;
+
+void SE_DrawMenuScreen(GameScreen *currentScreen, Editor *editor, XdData *data,
+ XdData *datas[]);
+void SE_DrawEditorScreen(GameScreen *currentScreen, Editor *editor,
+ Camera2D *camera);
diff --git a/src/xd.c b/src/xd.c
index 5e9644e..32cc83e 100644
--- a/src/xd.c
+++ b/src/xd.c
@@ -4,15 +4,12 @@
#include <stdio.h>
#include <stdlib.h>
-XdData *Xd_LoadFromFile(const char *filePath) {
+XdData Xd_LoadFromFile(const char *filePath) {
FILE *file = fopen(filePath, "rb");
- if (file == NULL) {
- return NULL;
- }
-
- XdData *data = malloc(sizeof(XdData));
- fread(data, sizeof(XdData), 1, file);
+ XdData data;
+ fread(&data, sizeof(XdData), 1, file);
+ printf("1 %s\n", data.name);
fclose(file);
return data;
diff --git a/src/xd.h b/src/xd.h
index 5ecd465..690fe76 100644
--- a/src/xd.h
+++ b/src/xd.h
@@ -53,7 +53,7 @@ typedef struct {
XdLevel *levels[];
} XdData;
-XdData *Xd_LoadFromFile(const char *filePath);
+XdData Xd_LoadFromFile(const char *filePath);
void Xd_SaveFile(const char *filePath, XdData *xd);
#endif