cepheid

An Aurora 4X clone
Log | Files | Refs | README

commit c4b9af2f720b7261863f2d671b4ee24babcbec3c
parent 0aa5326a05be8deb3d1aa5a2d01cb6ddfb0738e6
Author: hhvn <dev@hhvn.uk>
Date:   Fri,  7 Oct 2022 16:26:03 +0100

Save systree

Diffstat:
Msrc/data.c | 5+----
Msrc/db.c | 77+++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Msrc/main.c | 25+++++++++++++++++++------
Msrc/main.h | 10+++++++---
Msrc/save.c | 5++---
Msrc/struct.h | 5+++++
Msrc/system.c | 42++++++++++++++++++++++++++++++++++++++++--
Msrc/ui.c | 2+-
8 files changed, 122 insertions(+), 49 deletions(-)

diff --git a/src/data.c b/src/data.c @@ -47,16 +47,13 @@ unsigned char settings_png[] = { }; #define IMAGE_LOAD(name) \ - loading_update(lscr, "Loading image"); \ raw_image_##name = LoadImageFromMemory(".png", \ name##_png, sizeof(name##_png)); \ image_##name = LoadTextureFromImage(raw_image_##name); \ UnloadImage(raw_image_##name) void -data_load(Loader *lscr) { - /* update main.h when adding loading steps */ - loading_update(lscr, "Loading fonts"); +data_load(void) { font = LoadFontFromMemory(".ttf", DejaVuSansMono_ttf, sizeof(DejaVuSansMono_ttf), FONT_SIZE, NULL, 0); charpx = MeasureTextEx(font, ".", FONT_SIZE, FONT_SIZE/10).x + FONT_SIZE/10; diff --git a/src/db.c b/src/db.c @@ -1,5 +1,7 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> +#include <limits.h> #include "main.h" int @@ -37,36 +39,6 @@ dbsetfloat(char *dir, char *group, char *key, float val) { return dbsetf(dir, group, key, "%f", val); } -void -dbsetbody(System *sys, Body *body) { - char *group; - char *parent; - - group = smprintf("%s/%s", sys->name, body->name); - - if (body->parent) - parent = body->parent->name; - else - parent = sys->name; - dbset(save->db.systems, group, "parent", parent); - - dbset(save->db.systems, group, "type", bodytype_strify(body)); - dbsetfloat(save->db.systems, group, "radius", body->radius); - dbsetfloat(save->db.systems, group, "mass", body->mass); - dbsetfloat(save->db.systems, group, "orbdays", body->orbdays); - if (body->type == BODY_COMET) { - dbsetfloat(save->db.systems, group, "mindist", 0 - body->mindist); /* see sys_load() */ - dbsetfloat(save->db.systems, group, "maxdist", body->maxdist); - dbsetfloat(save->db.systems, group, "curdist", body->curdist); - dbsetfloat(save->db.systems, group, "theta", body->theta); - dbsetfloat(save->db.systems, group, "inward", body->inward); - } else { - dbsetfloat(save->db.systems, group, "dist", body->dist); - dbsetfloat(save->db.systems, group, "curtheta", body->curtheta); - } - free(group); -} - int vdbgetf(char *dir, char *group, char *key, char *fmt, va_list args) { va_list ap; @@ -109,3 +81,48 @@ dbgetfloat(char *dir, char *group, char *key) { dbgetf(dir, group, key, "%f", &ret); return ret; } + +int +dbsettree(char *dir, Tree *t, Treesetter func) { + char *path[TREEMAX]; + char group[PATH_MAX]; + char *sp; + size_t sl, i, len; + int depth; + Tree *p; + int ret = 0; + + for (p = NULL; tree_iter(t, TREEMAX, &p, &depth) != -1; ) { +next: + path[depth] = p->name; + + if (p->data) { + sl = sizeof(group); + sp = group; + for (i = 0; i <= depth; i++) { + len = strlen(path[i]); + if (len + (p->d ? strlen("index") : 0) >= sl) { + ret = -1; + warning("insufficient space to concatenate tree path\n"); + goto next; + } + + memcpy(sp, path[i], len); + if (i != depth || p->d) + sp[len] = '/'; + else + sp[len] = '\0'; + sp += len + 1; + sl -= len + 1; + } + if (p->d) { + len = strlen("index"); + memcpy(sp, "index", len + 1); + } + + func(dir, group, depth, p); + } + } + + return ret; +} diff --git a/src/main.c b/src/main.c @@ -1,11 +1,14 @@ #include <stdio.h> #include <time.h> #include <raylib.h> +#include <signal.h> #include "main.h" #define DEFSAVE "default" Save *save = NULL; +int sigint = 0; +int sigterm = 0; void warning(char *fmt, ...) { @@ -17,22 +20,32 @@ warning(char *fmt, ...) { va_end(ap); } +static void +sighandler(int signal) { + switch (signal) { + case SIGINT: sigint = 1; break; + case SIGTERM: sigterm = 1; break; + } +} + int main(void) { int view_prev; - Loader *loader; + struct sigaction sa; - loader = loading_open(DATA_LOAD_STEPS + SAVE_READ_STEPS + 3, "Initializing UI"); + sa.sa_handler = sighandler; + sa.sa_flags = SA_RESTART; + sigemptyset(&sa.sa_mask); + sigaction(SIGINT, &sa, NULL); + sigaction(SIGTERM, &sa, NULL); ui_init(); - data_load(loader); + data_load(); if (!save_exists(DEFSAVE)) save_create(DEFSAVE); - save_read(loader, DEFSAVE); - - loading_close(loader); + save_read(DEFSAVE); /* The window is hidden so that only the loading bar is shown. Hiding * and unhiding the window also has the added effect of making it diff --git a/src/main.h b/src/main.h @@ -18,6 +18,8 @@ /* main.c */ extern Save *save; +extern int sigint; +extern int sigterm; void warning(char *fmt, ...); /* str.c */ @@ -43,6 +45,7 @@ void editins(wchar_t *str, int *len, int *cur, int size, wchar_t c); Tree * tree_add_child(Tree *t, char *name, int type, void *data, Tree **ptr); int tree_delete(Tree **t, int freedata); int tree_delete_r(Tree **t, int freedata); +int tree_iter(Tree *t, int maxdepth, Tree **p, int *depth); /* ui.c */ #define VIEWS_MAX_WIDTH (UI_VIEW_LAST*100) @@ -145,6 +148,7 @@ Vector2 sys_get_vector(Body *body); Polar sys_get_polar(Body *body); System *sys_init(char *name); System *sys_load(System *s, char *name); +void sys_tree_setter(char *dir, char *group, int depth, Tree *t); System *sys_get(char *name); System *sys_default(void); @@ -156,7 +160,7 @@ void body_sort(Body **bodies, size_t n); /* save.c */ #define SAVE_READ_STEPS 2 -void save_read(Loader *lscr, char *dir); +void save_read(char *dir); void save_write(void); int save_exists(char *name); int save_create(char *name); @@ -174,7 +178,7 @@ extern Texture image_design; extern Texture image_sys; extern Texture image_settings; #define DATA_LOAD_STEPS (1 + 7) -void data_load(Loader *lscr); +void data_load(void); void data_unload(void); /* db.c */ @@ -182,11 +186,11 @@ int vdbsetf(char *dir, char *group, char *key, char *fmt, va_list args); int dbsetf(char *dir, char *group, char *key, char *fmt, ...); int dbsetint(char *dir, char *group, char *key, int val); int dbsetfloat(char *dir, char *group, char *key, float val); -void dbsetbody(System *sys, Body *body); int vdbgetf(char *dir, char *group, char *key, char *fmt, va_list args); int dbgetf(char *dir, char *group, char *key, char *fmt, ...); int dbgetint(char *dir, char *group, char *key); float dbgetfloat(char *dir, char *group, char *key); +int dbsettree(char *dir, Tree *t, Treesetter func); /* loading.c */ Loader *loading_open(int steps, char *initstr); diff --git a/src/save.c b/src/save.c @@ -24,7 +24,7 @@ save_free(void) { } void -save_read(Loader *lscr, char *name) { +save_read(char *name) { char dir[PATH_MAX]; char *str; @@ -38,13 +38,11 @@ save_read(Loader *lscr, char *name) { memset(&save->systems, 0, sizeof(save->systems)); - loading_update(lscr, "Initializing DB"); dbdeclare(dir); save->db.dir = nstrdup(dir); save->db.races = smprintf("%s/Races", dir); save->db.systems = smprintf("%s/Systems", dir); save->db.fleets = smprintf("%s/Fleets", dir); - loading_update(lscr, "Loading systems"); if ((str = dbget(save->db.dir, "index", "homesystem"))) save->homesys = sys_get(str); return; @@ -54,6 +52,7 @@ void save_write(void) { if (view_main.sys) dbset(save->db.dir, "index", "selsystem", view_main.sys->name); + dbsettree(save->db.systems, &save->systems, sys_tree_setter); dbwrite(save->db.dir); } diff --git a/src/struct.h b/src/struct.h @@ -2,6 +2,8 @@ #include <sys/types.h> /* tree.c */ +#define TREEMAX 64 /* max depth: not actually enforced anywhere, anything + deeper than this will get ignored in some places */ typedef struct Tree Tree; struct Tree { Tree *p; /* previous */ @@ -14,6 +16,9 @@ struct Tree { Tree *n; /* next */ }; +/* typedef void (*Treegetter)(char *dir, char *group, int depth, Tree *t); */ +typedef void (*Treesetter)(char *dir, char *group, int depth, Tree *t); + /* system.c */ enum { SYSTREE_SYS, diff --git a/src/system.c b/src/system.c @@ -109,8 +109,8 @@ sys_load(System *s, char *name) { if (!s) s = sys_init(name); - s->lypos.x = strnum(dbget(save->db.systems, name, "x")); - s->lypos.y = strnum(dbget(save->db.systems, name, "y")); + s->lypos.x = dbgetfloat(save->db.systems, name, "x"); + s->lypos.y = dbgetfloat(save->db.systems, name, "y"); dir = smprintf("%s/", s->name); blen = dblistgroups_f(&bname, save->db.systems, &filter_bodyinsystem, dir); @@ -202,6 +202,44 @@ sys_load(System *s, char *name) { return s; } +void +sys_tree_setter(char *dir, char *group, int depth, Tree *t) { + System *s; + Body *b; + char *parent; + + switch (t->type) { + case SYSTREE_SYS: + s = t->data; + dbsetfloat(dir, group, "x", s->lypos.x); + dbsetfloat(dir, group, "y", s->lypos.y); + case SYSTREE_BODY: + b = t->data; + + if (body->parent) { + parent = b->parent->name; + } else { + s = t->u->data; + parent = s->name; + } + dbset(save->db.systems, group, "parent", parent); + + dbsetfloat(dir, group, "radius", b->radius); + dbsetfloat(dir, group, "mass", b->mass); + dbsetfloat(dir, group, "orbdays", b->orbdays); + if (b->type == BODY_COMET) { + dbsetfloat(dir, group, "mindist", b->mindist); + dbsetfloat(dir, group, "maxdist", b->maxdist); + dbsetfloat(dir, group, "curdist", b->curdist); + dbsetfloat(dir, group, "theta", b->theta); + dbsetfloat(dir, group, "inward", b->inward); + } else { + dbsetfloat(dir, group, "dist", b->dist); + dbsetfloat(dir, group, "curtheta", b->curtheta); + } + } +} + System * sys_get(char *name) { /* For now, call sys_load. In future, get the system via save. */ diff --git a/src/ui.c b/src/ui.c @@ -89,7 +89,7 @@ ui_update_focus(enum UiElements type, void *p) { int ui_loop(void) { - if (WindowShouldClose()) + if (WindowShouldClose() || sigint || sigterm) return 0; ffree();