cepheid

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

commit ba89fc3585bd7cff88251651d79c686f76197942
parent c1c48c0c888a54fc3ef775e95cca23f7a0f929a9
Author: hhvn <dev@hhvn.uk>
Date:   Thu,  1 Sep 2022 11:31:57 +0100

Body sorting

Diffstat:
Asrc/body.c | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/main.h | 8++++++--
Msrc/system.c | 41+++--------------------------------------
3 files changed, 71 insertions(+), 40 deletions(-)

diff --git a/src/body.c b/src/body.c @@ -0,0 +1,62 @@ +#include <stdlib.h> +#include <raylib.h> +#include "main.h" + +static char *bodytype_names[BODY_LAST] = { + [BODY_STAR] = "Star", + [BODY_PLANET] = "Planet", + [BODY_DWARF] = "Dwarf planet", + [BODY_ASTEROID] = "Asteroid", + [BODY_COMET] = "Comet", + [BODY_MOON] = "Moon", + [BODY_PLANET + BODY_MOON] = "Moon", + [BODY_DWARF + BODY_MOON] = "Dwarf planet moon", + [BODY_ASTEROID + BODY_MOON] = "Asteroid moon", + [BODY_COMET + BODY_MOON] = "Comet moon", +}; + +int +bodytype_enumify(char *name) { + if (strsuffix(name, "moon") || streq(name, "Moon")) + return BODY_MOON; + else if (streq(name, "Star")) + return BODY_STAR; + else if (streq(name, "Planet")) + return BODY_PLANET; + else if (streq(name, "Dwarf planet")) + return BODY_DWARF; + else if (streq(name, "Asteroid")) + return BODY_ASTEROID; + else if (streq(name, "Comet")) + return BODY_COMET; + else + return -1; +} + +char * +bodytype_strify(Body *body) { + return bodytype_names[body->type + + (body->parent ? body->parent->type : 0)]; +} + +int +body_cmp(Body *b1, Body *b2) { + float v1, v2; + Body *p; + + for (p = b1, v1 = 0; p->parent; p = p->parent) + v1 += (p->type == BODY_COMET ? p->maxdist : p->dist); + for (p = b2, v2 = 0; p->parent; p = p->parent) + v2 += (p->type == BODY_COMET ? p->maxdist : p->dist); + return (v1 == v2 ? 0 : (v1 > v2 ? 1 : -1)); +} + +static int +body_cmp_sort(const void *a, const void *b) { + return body_cmp(*(const Body **)a, *(const Body **)b); +} + +void +body_sort(Body **bodies, size_t n) { + qsort(bodies, n, sizeof(Body *), body_cmp_sort); +} diff --git a/src/main.h b/src/main.h @@ -109,8 +109,6 @@ float pane_y(float y); Vector2 pane_v(Vector2 v); /* system.c */ -int bodytype_enumify(char *name); -char * bodytype_strify(Body *body); Vector2 sys_vectorize(Polar polar); Vector2 sys_vectorize_around(Vector2 around, Polar polar); Polar sys_polarize(Vector2 vector); @@ -123,6 +121,12 @@ System *sys_load(System *s, char *name); System *sys_get(char *name); System *sys_default(void); +/* body.c */ +int bodytype_enumify(char *name); +char * bodytype_strify(Body *body); +int body_cmp(Body *b1, Body *b2); +void body_sort(Body **bodies, size_t n); + /* save.c */ #define SAVE_READ_STEPS 2 void save_read(Loader *lscr, char *dir); diff --git a/src/system.c b/src/system.c @@ -1,46 +1,9 @@ #include <math.h> #include <string.h> #include <stdlib.h> -#include "raylib.h" +#include <raylib.h> #include "main.h" -static char *bodytype_names[BODY_LAST] = { - [BODY_STAR] = "Star", - [BODY_PLANET] = "Planet", - [BODY_DWARF] = "Dwarf planet", - [BODY_ASTEROID] = "Asteroid", - [BODY_COMET] = "Comet", - [BODY_MOON] = "Moon", - [BODY_PLANET + BODY_MOON] = "Moon", - [BODY_DWARF + BODY_MOON] = "Dwarf planet moon", - [BODY_ASTEROID + BODY_MOON] = "Asteroid moon", - [BODY_COMET + BODY_MOON] = "Comet moon", -}; - -int -bodytype_enumify(char *name) { - if (strsuffix(name, "moon") || streq(name, "Moon")) - return BODY_MOON; - else if (streq(name, "Star")) - return BODY_STAR; - else if (streq(name, "Planet")) - return BODY_PLANET; - else if (streq(name, "Dwarf planet")) - return BODY_DWARF; - else if (streq(name, "Asteroid")) - return BODY_ASTEROID; - else if (streq(name, "Comet")) - return BODY_COMET; - else - return -1; -} - -char * -bodytype_strify(Body *body) { - return bodytype_names[body->type + - (body->parent ? body->parent->type : 0)]; -} - Vector2 sys_vectorize(Polar polar) { return (Vector2) { @@ -226,6 +189,8 @@ sys_load(System *s, char *name) { dblistfree(bname, blen); free(dir); + body_sort(s->bodies, s->bodies_len); + return s; }