cepheid

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

commit 6282e42d22db93c841e2fd8137c20ff2bf1c2b6e
parent e1dc11030e3248648db58de69e027f19b6a8edb3
Author: hhvn <dev@hhvn.uk>
Date:   Sat,  6 Aug 2022 17:44:56 +0200

Icons

Diffstat:
MMakefile | 1+
Adata/.gitignore | 1+
Mdata/Makefile | 7+++++--
Adata/icons/COPYING | 1+
Adata/icons/colonies.png | 0
Adata/icons/colonies.xcf | 0
Adata/icons/design.png | 0
Adata/icons/design.xcf | 0
Adata/icons/fleet.png | 0
Adata/icons/fleet.xcf | 0
Adata/icons/settings.png | 0
Adata/icons/settings.xcf | 0
Adata/icons/sys.png | 0
Adata/icons/sys.xcf | 0
Adata/icons/tactical.png | 0
Adata/icons/tactical.xcf | 0
Msrc/data.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/main.c | 3++-
Msrc/main.h | 33++++++++++++++++++++-------------
Msrc/struct.h | 1+
Msrc/style.h | 7+++++++
Msrc/system.c | 36++++++++++++++++++------------------
Msrc/ui.c | 38++++++++++++++++++++++++--------------
23 files changed, 150 insertions(+), 50 deletions(-)

diff --git a/Makefile b/Makefile @@ -11,6 +11,7 @@ LDFLAGS = $(RAYLIB) $(DBLIB) CFLAGS = -Wall -g3 -O0 all: db data $(BIN) +src/data.o: data/icons/* $(OBJ): src/struct.h $(BIN): $(OBJ) $(DBLIB) diff --git a/data/.gitignore b/data/.gitignore @@ -0,0 +1 @@ +*.h diff --git a/data/Makefile b/data/Makefile @@ -1,5 +1,6 @@ FONTS = $(shell find . -name "*.ttf") -HEADERS = $(FONTS:.ttf=.h) +ICONS = $(shell find icons -name "*.png") +HEADERS = $(FONTS:.ttf=.h) $(ICONS:.png=.h) all: $(HEADERS) sol @@ -16,8 +17,10 @@ worlds.tsv: .ttf.h: xxd -i < $< > $@ +.png.h: + xxd -i < $< > $@ clean: rm -rf $(HEADERS) sol -.SUFFIXES: .h .ttf +.SUFFIXES: .h .ttf .png diff --git a/data/icons/COPYING b/data/icons/COPYING @@ -0,0 +1 @@ +The files in this directory are placed in the public domain by their author(s). diff --git a/data/icons/colonies.png b/data/icons/colonies.png Binary files differ. diff --git a/data/icons/colonies.xcf b/data/icons/colonies.xcf Binary files differ. diff --git a/data/icons/design.png b/data/icons/design.png Binary files differ. diff --git a/data/icons/design.xcf b/data/icons/design.xcf Binary files differ. diff --git a/data/icons/fleet.png b/data/icons/fleet.png Binary files differ. diff --git a/data/icons/fleet.xcf b/data/icons/fleet.xcf Binary files differ. diff --git a/data/icons/settings.png b/data/icons/settings.png Binary files differ. diff --git a/data/icons/settings.xcf b/data/icons/settings.xcf Binary files differ. diff --git a/data/icons/sys.png b/data/icons/sys.png Binary files differ. diff --git a/data/icons/sys.xcf b/data/icons/sys.xcf Binary files differ. diff --git a/data/icons/tactical.png b/data/icons/tactical.png Binary files differ. diff --git a/data/icons/tactical.xcf b/data/icons/tactical.xcf Binary files differ. diff --git a/src/data.c b/src/data.c @@ -1,6 +1,74 @@ -#include <stddef.h> +#include <raylib.h> +#include "main.h" + +#define IMAGE(name) \ + static Image raw_image_##name; \ + Texture image_##name + +Font font; +IMAGE(tactical); +IMAGE(colonies); +IMAGE(fleet); +IMAGE(design); +IMAGE(sys); +IMAGE(settings); unsigned char DejaVuSansMono_ttf[] = { #include "../data/DejaVuSansMono.h" }; -size_t DejaVuSansMono_ttf_size = sizeof(DejaVuSansMono_ttf); + +unsigned char tactical_png[] = { +#include "../data/icons/tactical.h" +}; + +unsigned char colonies_png[] = { +#include "../data/icons/colonies.h" +}; + +unsigned char fleet_png[] = { +#include "../data/icons/fleet.h" +}; + +unsigned char design_png[] = { +#include "../data/icons/design.h" +}; + +unsigned char sys_png[] = { +#include "../data/icons/sys.h" +}; + +unsigned char settings_png[] = { +#include "../data/icons/settings.h" +}; + +#define IMAGE_LOAD(name) \ + raw_image_##name = LoadImageFromMemory(".png", \ + name##_png, sizeof(name##_png)); \ + image_##name = LoadTextureFromImage(raw_image_##name) + +void +data_load(void) { + font = LoadFontFromMemory(".ttf", DejaVuSansMono_ttf, + sizeof(DejaVuSansMono_ttf), FONT_SIZE, NULL, 0); + IMAGE_LOAD(tactical); + IMAGE_LOAD(colonies); + IMAGE_LOAD(fleet); + IMAGE_LOAD(design); + IMAGE_LOAD(sys); + IMAGE_LOAD(settings); +} + +#define IMAGE_UNLOAD(name) \ + UnloadTexture(image_##name); \ + UnloadImage(raw_image_##name); + +void +data_unload(void) { + UnloadFont(font); + IMAGE_UNLOAD(tactical); + IMAGE_UNLOAD(colonies); + IMAGE_UNLOAD(fleet); + IMAGE_UNLOAD(design); + IMAGE_UNLOAD(sys); + IMAGE_UNLOAD(settings); +} diff --git a/src/main.c b/src/main.c @@ -11,11 +11,12 @@ main(void) { char *system; ui_init(); + data_load(); save = save_init(TESTSAVE); system = dbget(save->db.dir, "index", "selsystem"); if (!system) system = "Sol"; /* TODO: 1. selsystem, 2. player home, 3. uhh? */ - save->system = system_load(NULL, system); + save->system = sys_load(NULL, system); while (!WindowShouldClose()) { ui_clickable_update(); diff --git a/src/main.h b/src/main.h @@ -50,31 +50,38 @@ void ui_handle_view_main(void); void ui_handle_view_colonies(void); void ui_handle_view_fleets(void); void ui_handle_view_design(void); -void ui_handle_view_systems(void); +void ui_handle_view_sys(void); void ui_handle_view_settings(void); void ui_draw_view_main(void); void ui_draw_view_colonies(void); void ui_draw_view_fleets(void); void ui_draw_view_design(void); -void ui_draw_view_systems(void); +void ui_draw_view_sys(void); void ui_draw_view_settings(void); /* system.c */ int bodytype_enumify(char *name); char * bodytype_strify(Body *body); -Vector2 system_vectorize(Polar polar); -Vector2 system_vectorize_around(Vector2 around, Polar polar); -Polar system_polarize(Vector2 vector); -Polar system_sum_polar(Polar absolute, Polar relative); -Vector2 system_get_vector(Body *body); -Polar system_get_polar(Body *body); -System *system_init(char *name); -System *system_load(System *s, char *name); +Vector2 sys_vectorize(Polar polar); +Vector2 sys_vectorize_around(Vector2 around, Polar polar); +Polar sys_polarize(Vector2 vector); +Polar sys_sum_polar(Polar absolute, Polar relative); +Vector2 sys_get_vector(Body *body); +Polar sys_get_polar(Body *body); +System *sys_init(char *name); +System *sys_load(System *s, char *name); /* save.c */ Save * save_init(char *savedir); +void save_write(Save *s); /* data.c */ -#include <stddef.h> -extern unsigned char DejaVuSansMono_ttf[]; -extern size_t DejaVuSansMono_ttf_size; +extern Font font; +extern Texture image_tactical; +extern Texture image_colonies; +extern Texture image_fleet; +extern Texture image_design; +extern Texture image_sys; +extern Texture image_settings; +void data_load(void); +void data_unload(void); diff --git a/src/struct.h b/src/struct.h @@ -81,6 +81,7 @@ typedef struct { int n; int sel; struct { + Texture *icon; char *name; int w; /* 0 = fill */ } tabs[TABS_MAX]; diff --git a/src/style.h b/src/style.h @@ -26,11 +26,13 @@ #undef MAGENTA #undef RAYWHITE +#define X_PUREWHITE 0xffffffff #define X_WHITE 0xe6e6e6ff #define X_AURORA_GREY 0x1e1e1eff #define X_AURORA_BLUE 0x00003cff #define X_DARKBLUE 0x00002cff #define X_AURORA_GREEN 0x649696ff +#define X_TRANSPARENT 0x00000000 #define UNHEX(col) ((Color){ \ ((col & (0xff << 24)) >> 24), \ @@ -38,11 +40,13 @@ ((col & (0xff << 8)) >> 8), \ (col & 0xff)}) +#define PUREWHITE UNHEX(X_PUREWHITE) #define WHITE UNHEX(X_WHITE) #define AURORA_GREY UNHEX(X_AURORA_GREY) #define AURORA_BLUE UNHEX(X_AURORA_BLUE) #define DARKBLUE UNHEX(X_DARKBLUE) #define AURORA_GREEN UNHEX(X_AURORA_GREEN) +#define TRANSPARENT UNHEX(X_TRANSPARENT) /* colours */ #define COL_FG WHITE @@ -54,3 +58,6 @@ /* font */ #define FONT_SIZE 10 + +/* textures */ +#define NO_TINT PUREWHITE /* shrug */ diff --git a/src/system.c b/src/system.c @@ -42,7 +42,7 @@ bodytype_strify(Body *body) { } Vector2 -system_vectorize(Polar polar) { +sys_vectorize(Polar polar) { return (Vector2) { polar.r * cosf(polar.theta), polar.r * sinf(polar.theta) @@ -50,8 +50,8 @@ system_vectorize(Polar polar) { } Vector2 -system_vectorize_around(Vector2 around, Polar polar) { - Vector2 relative = system_vectorize(polar); +sys_vectorize_around(Vector2 around, Polar polar) { + Vector2 relative = sys_vectorize(polar); return (Vector2) { around.x + relative.x, around.y + relative.y @@ -59,7 +59,7 @@ system_vectorize_around(Vector2 around, Polar polar) { } Polar -system_polarize(Vector2 vector) { +sys_polarize(Vector2 vector) { return (Polar) { hypotf(vector.x, vector.y), atan2f(vector.y, vector.x) @@ -67,17 +67,17 @@ system_polarize(Vector2 vector) { } Polar -system_sum_polar(Polar absolute, Polar relative) { - return system_polarize(system_vectorize_around(system_vectorize(absolute), relative)); +sys_sum_polar(Polar absolute, Polar relative) { + return sys_polarize(sys_vectorize_around(sys_vectorize(absolute), relative)); } Vector2 -system_get_vector(Body *body) { - return system_vectorize(system_get_polar(body)); +sys_get_vector(Body *body) { + return sys_vectorize(sys_get_polar(body)); } Polar -system_get_polar(Body *body) { +sys_get_polar(Body *body) { Polar polar; if (body->polar.r != INFINITY && @@ -89,7 +89,7 @@ system_get_polar(Body *body) { polar.r = body->curdist; polar.theta = body->theta; } else { - polar = system_sum_polar(system_get_polar(body->parent), + polar = sys_sum_polar(sys_get_polar(body->parent), (Polar){body->curdist, body->theta}); } } else { @@ -97,7 +97,7 @@ system_get_polar(Body *body) { polar.r = body->dist; polar.theta = body->curtheta; } else { - polar = system_sum_polar(system_get_polar(body->parent), + polar = sys_sum_polar(sys_get_polar(body->parent), (Polar){body->dist, body->curtheta}); } } @@ -107,7 +107,7 @@ system_get_polar(Body *body) { } System * -system_init(char *name) { +sys_init(char *name) { System *ret = malloc(sizeof(System)); if (!ret) return NULL; ret->name = nstrdup(name); @@ -127,16 +127,16 @@ filter_bodyinsystem(void *data, char *path) { } /* If s is true, ignore name and load the system. - * If s is NULL, call system_init(name); */ + * If s is NULL, call sys_init(name); */ System * -system_load(System *s, char *name) { +sys_load(System *s, char *name) { char *dir, *tmp; char **bname; char **bparent; size_t blen, i; int pos; - if (!s) s = system_init(name); + if (!s) s = sys_init(name); dir = smprintf("%s/", s->name); s->bodies_len = blen = dblistgroups_f(&bname, save->db.systems, &filter_bodyinsystem, dir); @@ -171,7 +171,7 @@ system_load(System *s, char *name) { s->bodies[i]->curtheta = strnum(dbget(save->db.systems, bname[i], "curtheta")); } - /* so system_get_polar() knows if it's usable */ + /* so sys_get_polar() knows if it's usable */ s->bodies[i]->polar = (Polar) { INFINITY, INFINITY }; } @@ -187,9 +187,9 @@ system_load(System *s, char *name) { /* third pass: get coords (needs parent ptr from second pass) */ for (i = 0; i < blen; i++) { - system_get_polar(s->bodies[i]); /* Builds the cache for us: this is more + sys_get_polar(s->bodies[i]); /* Builds the cache for us: this is more efficient as it can cache the parent too */ - s->bodies[i]->vector = system_vectorize(s->bodies[i]->polar); + s->bodies[i]->vector = sys_vectorize(s->bodies[i]->polar); } for (i = 0; i < blen; i++) { diff --git a/src/ui.c b/src/ui.c @@ -11,7 +11,6 @@ #define MIN_BODY_DIAM 3 #define SCREEN_RECT() ((Rect){0, 0, GetScreenWidth(), GetScreenHeight()}) -static Font font; static Clickable clickable[CLICKABLE_MAX]; void (*view_handlers[UI_VIEW_LAST])(void) = { @@ -19,7 +18,7 @@ void (*view_handlers[UI_VIEW_LAST])(void) = { [UI_VIEW_COLONIES] = ui_handle_view_colonies, [UI_VIEW_FLEETS] = ui_handle_view_fleets, [UI_VIEW_DESIGN] = ui_handle_view_design, - [UI_VIEW_SYSTEMS] = ui_handle_view_systems, + [UI_VIEW_SYSTEMS] = ui_handle_view_sys, [UI_VIEW_SETTINGS] = ui_handle_view_settings, }; @@ -28,15 +27,19 @@ void (*view_drawers[UI_VIEW_LAST])(void) = { [UI_VIEW_COLONIES] = ui_draw_view_colonies, [UI_VIEW_FLEETS] = ui_draw_view_fleets, [UI_VIEW_DESIGN] = ui_draw_view_design, - [UI_VIEW_SYSTEMS] = ui_draw_view_systems, + [UI_VIEW_SYSTEMS] = ui_draw_view_sys, [UI_VIEW_SETTINGS] = ui_draw_view_settings, }; Tabs view_tabs = { /* Tactical is the terminology used in Aurora, so I decided to use it * in the ui; in the code it's just called 'main' for my fingers' sake */ - UI_VIEW_LAST, 0, {{"Tactical", 0}, {"Colonies", 0}, {"Fleets", 0}, {"Design", 0}, - {"Systems", 0}, {"Settings", 0}} + UI_VIEW_LAST, 0, {{&image_tactical, "Tactical", 0}, + {&image_colonies, "Colonies", 0}, + {&image_fleet, "Fleets", 0}, + {&image_design, "Design", 0}, + {&image_sys, "Systems", 0}, + {&image_settings, "Settings", 0}} }; static struct { @@ -69,7 +72,7 @@ static struct { } view_main = { .infobox = { .tabs = { - 2, 0, {{"Display", 0}, {"Minerals", 0}} + 2, 0, {{NULL, "Display", 0}, {NULL, "Minerals", 0}} }, .names = { .dwarf = {1, "Name: dwarf planets"}, @@ -107,10 +110,6 @@ ui_init(void) { InitWindow(500, 500, "testing raylib"); SetWindowState(FLAG_WINDOW_RESIZABLE); SetTargetFPS(TARGET_FPS); - - font = LoadFontFromMemory(".ttf", - DejaVuSansMono_ttf, DejaVuSansMono_ttf_size, - FONT_SIZE, NULL, 0); } void @@ -266,6 +265,7 @@ ui_draw_tabs(int x, int y, int w, int h, Tabs *tabs) { int fw, fn, ftabw; int tabw; int padx, pady; + int iw; int cx, selx = -1; int i; @@ -288,12 +288,22 @@ ui_draw_tabs(int x, int y, int w, int h, Tabs *tabs) { tabw = ftabw; else tabw = tabs->tabs[i].w; - padx = (tabw - ui_textsize(tabs->tabs[i].name)) / 2; + + if (tabs->tabs[i].icon) + iw = tabs->tabs[i].icon->width; + else + iw = 0; + + padx = (tabw - ui_textsize(tabs->tabs[i].name) - iw) / 2; if (i == tabs->sel) selx = cx; else DrawRectangle(cx, y, tabw, h, COL_UNSELBG); - ui_print(cx + padx, y + pady, COL_FG, "%s", tabs->tabs[i].name); + ui_print(cx + padx + iw, y + pady, COL_FG, "%s", tabs->tabs[i].name); + if (tabs->tabs[i].icon) + DrawTexture(*tabs->tabs[i].icon, cx + padx / 2, + y + (h - tabs->tabs[i].icon->width) / 2, + COL_FG); DrawRectangle(cx + tabw - 1, y, 1, h, COL_BORDER); } @@ -418,7 +428,7 @@ ui_handle_view_design(void) { } void -ui_handle_view_systems(void) { +ui_handle_view_sys(void) { ui_title("Systems"); } @@ -579,7 +589,7 @@ ui_draw_view_design(void) { } void -ui_draw_view_systems(void) { +ui_draw_view_sys(void) { ui_print(10, GetScreenHeight() / 2, COL_FG, "System info/settings menu"); ui_print(GetScreenWidth() / 2, GetScreenHeight() / 2, COL_FG, "Pannable system view"); }