From 69a16c4920707fcf2bfd784247e9face2d47eb69 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Mon, 30 Dec 2024 16:22:01 +0100 Subject: [PATCH] re-coded hash tables to match type + cleaned some fct --- .vscode/settings.json | 3 +- bin/back | Bin 95072 -> 93984 bytes obj/base.o | Bin 66704 -> 64528 bytes obj/display.o | Bin 27224 -> 27224 bytes obj/hash.o | Bin 13952 -> 13664 bytes obj/main.o | Bin 12488 -> 12488 bytes obj/move.o | Bin 55808 -> 56528 bytes src/base.c | 60 ---------- src/base.h | 4 - src/hash.c | 253 ++++++++++++++++-------------------------- src/hash.h | 83 +++----------- src/main.c | 1 + src/move.c | 10 +- src/structure.h | 39 +++++++ 14 files changed, 163 insertions(+), 290 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f314253..eaa918d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,7 @@ "files.associations": { "ncurses.h": "c", "stdio.h": "c", - "math.h": "c" + "math.h": "c", + "sdl_image.h": "c" } } \ No newline at end of file diff --git a/bin/back b/bin/back index 1559060e27f500bda9823c132a6fe6252b61c692..b31b6488854cf80560c4f921197a385c69085b27 100755 GIT binary patch delta 21681 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 delta 24050 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 diff --git a/obj/base.o b/obj/base.o index b28fbe8715792d323775b37ec65416d6b598a9cf..133f544f7f503ddc42c5c2d45350eab042cdd7c8 100644 GIT binary patch literal 64528 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 literal 66704 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
~;pLvQu%;mpW@iE+wmMi`Xp2w>d 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 diff --git a/obj/display.o b/obj/display.o index f116f472b319eeddf5ddee805ac73b87b99f31f5..8160256f3d84563c21133ffb4f33ef255e687874 100644 GIT binary patch delta 88 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 literal 13952 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 diff --git a/obj/main.o b/obj/main.o index c5cdc7f5fdbaac27e699b009795bae9a453a3348..e18d15dda690fa1c2ed0d518b78cb0293283dcac 100644 GIT binary patch delta 20 ccmX?+cp`DbeojWC%?CKynHj|vpWsme09oG$HUIzs delta 20 ccmX?+cp`DbeojWi%?CKynHfbFpWsme09nolGynhq diff --git a/obj/move.o b/obj/move.o index 15d3f0204da0a9ccc49df9a5d1c9b17711c25538..8276ed6061386d0532e7334a8af6cab791599eba 100644 GIT binary patch delta 2499 zcmai#e{54#6vyAaZ*OaX@>)vv`nqLwWU_+$)!~oDtlh|dSPU37#ON}OTWTSIU?ylF zE}cOIv&dLZh@rv6Nr(dl230di(C&{JQ2)@-wQT&e`GYWn%7`Wgm*Bm(x9sG_hMT;1 zPCw^-&pEyK^|kMF^@sE7AwP9y2G^XZ|F=L<`rDF0h1p%Jgwgk3XCHzJQ55~{jBr)% zwlFaJT|q)41*Bx0q1(FCp|BOz|4c^p+OapZ+0zWeSESUOeV=*XXgo~%+fw^(bnW}c z)c3!x!t=DbbnLe7Y8wsri+D7w??~R@nXKT(QMjmj;51#GO&a;%q!AcUAE&!1+@yQR z9f+z`_sb64x2J=34`!!u^^QU>^}#i&C(>#Kp>ua&zTi4NsU?2VHdd@}(pU2x;mPi1 zNh5I(N;BgMVwf?%PDP`Ke*ZKG>_jb^HkHEN617N17cF(px1cWSNM z#}8)RQs=w0#Zjo1XiJK0Y&7#+_Lc5rPs zNH09S%^>fI`yk9P|3jGDYM7r$6??)I1F6nH`8LD+I#12ZqUO)MPT;pZIe+D;JkKi! zZ0zj#;z|7Z%}u*J4=;zoR}4}OW9;=z1BP}QUF9;$O)-krBh?bb zLwR^R;&^AC;awb^GRlnsy*rHu@FaWkXx{-Bn{WVW@q`~B6|Qy+aXk5%Jp4=1C5gJ= zC+ZSX;Vvn}m!kcd&ckoQ*&Rkq5pS*RS@2`borO(uE;bQghPW4TFRH`eCAm5)5w{~= zljSk-5MV(A5@6npI4-mSah(4w;`pI_5plZ`TbOh!3ShymJp4_>@jwR<$93Y8^Bpb8 z?F6*F>W&r52+!t=|1S7-Sn}l@vX$dUB==k^ChK|CRA-&LWn;tQ2gq@ZaIB9)rv!j`S3D zJ5I_Zkpm>{hGfdKs6lF`7r{@dN60NOCz`0O5IQD8+{BsjyarRu3>Sho9ij(zLkBb8 zS3x`-BJ(hrZlazm;LU{WRkhjvD`6#iv!N_LYFLu0KFp%02u)M&PD{YY%n z>PwUOQH7L}aC~f`eb8b=)Jz}zK#77@K}$p>*_eQ$6|-nymV70!JbipmX0zom9>kFx$z=ToBOPIsX(#$__pFN-#4CiXW z^4UwLn{)Y%xOrfPt1fZXrLKCWtDfbm-*eW_ixFC7I0q^^DcVC(!8H1SIMD?kk>b+R zo&+nu%*s5)tn@UqJpniv3m0Ko?g_l53HUo!?OzsUwq8}ursxeJM)Vrz!}!t4Kow3^ zt9!@)Ev@$z=#@s{Bo7{8JE4t#5w8$YPeD9oIk8ljkx$|0%@#@X)!vQ+^w z#Wzrd>VB#611y)?19h9NI3GR_b#H$jevW&R%g~1FAa}6;$kX{)-0->R*P&~xMW(y1QS~i-(r`G z7ksUPk|yYFwd|E{&E>R#t7I$0vFEEiJ-fI{z7stM^7Q<~RoZU={i3WRDx3Ux5D)%Z z{5dN5R1Ps-^AnN>bNCHEBu84J@HMhOr0}yj-l5G_g!6JkSm75XuTc0E$zuw?Ci(jc zzb<)|;2m$@?3NU&l?^8)uT}V%9o!kzQOp@N82kA_bOohXl8rnDr z*-X;AB%1Te!o-LLqr)C(8VS-JgODCc(r66&Ftx9PET+$!A#yuOyPNqx8ai)>X-_ls fA!)n;SxgU6A5GHzEs!2fdUxE&8DE4GnVJ6qzEg*} diff --git a/src/base.c b/src/base.c index 7d3fd3e..a040a1f 100644 --- a/src/base.c +++ b/src/base.c @@ -109,66 +109,6 @@ int str_to_int(char* s) { return res; } -int get_integer(FILE* ptr) { - char c = fgetc(ptr); - - int res = 0 ; - int sign = 1; - - if(c == '-') { - sign = -1; - c = fgetc(ptr); - }; - - while(is_an_integer(c)) { - res = 10*res + (int)c - 48; - c = fgetc(ptr); - }; - return (res*sign); -} - -int get_integer_plus_align(FILE* ptr, FILE* ptr2) { - char c = fgetc(ptr); - char c2 = fgetc(ptr2); - - int res = 0 ; - int sign = 1; - - if(c == '-') { - sign = -1; - c = fgetc(ptr); - c2 = fgetc(ptr2); - }; - - while(is_an_integer(c)) { - res = 10*res + (int)c - 48; - c = fgetc(ptr); - c2 = fgetc(ptr2); - }; - return (res*sign); -} - -int count_char_in_line(FILE* ptr, char target) { - int res = 0 ; - char c = fgetc(ptr); - - while(c != EOF && c != '\n') { - if(c == target) { - res += 1; - } - c = fgetc(ptr); - }; - - return res; -} - -void terminate_line(FILE* ptr) { - char c = fgetc(ptr); - while(c != '\n' && c != EOF) { - c = fgetc(ptr); - } -} - bool str_equal(char* s1, char* s2) { if(s1[0] == '\0' || s2[0] == '\0') { return (s1[0] == '\0' && s2[0] == '\0'); diff --git a/src/base.h b/src/base.h index b29af16..3adcaed 100644 --- a/src/base.h +++ b/src/base.h @@ -13,10 +13,6 @@ double to_double(int n); int to_int(double n); int line_count(char* filename); int str_to_int(char* s); -int get_integer(FILE* ptr); -int get_integer_plus_align(FILE* ptr, FILE* ptr2); -int count_char_in_line(FILE* ptr, char c); -void terminate_line(FILE* ptr); bool str_equal(char* s1, char* s2); cube_0 create_cube_0(double x, double y, double z, double w, double h, double d, int r, int g, int b); diff --git a/src/hash.c b/src/hash.c index ea62a13..1951cfc 100644 --- a/src/hash.c +++ b/src/hash.c @@ -11,9 +11,66 @@ #include #include +#include "structure.h" #include "hash.h" -// Cantor pairing function +// ------------------------------------------------------------------------------------------------------- // + +bool linkedList_mem(linkedList lst, int chx, int chy) { + if(lst == NULL) { + return false ; + } else if(lst->chx == chx && lst->chy == chy) { + return true ; + } + return linkedList_mem(lst->next, chx, chy) ; +} + +room linkedList_find(linkedList lst, int chx, int chy) { + if(lst == NULL) { + fprintf(stderr, "ERROR : (%d, %d) is not a valid key in hash\n", chx, chy); + exit(1); + } else if(lst->chx == chx && lst->chy == chy) { + return *(lst->area) ; + } + return linkedList_find(lst->next, chx, chy) ; +} + +room* linkedList_find_opt(linkedList lst, int chx, int chy) { + if(lst == NULL) { + return NULL ; + } else if(lst->chx == chx && lst->chy == chy) { + return (lst->area) ; + } + return linkedList_find_opt(lst->next, chx, chy) ; +} + +void linkedList_add(linkedList lst, int chx, int chy, room* area) { + if(lst == NULL) { + fprintf(stderr, "ERROR : cannot add to NULL\n"); + exit(1) ; + } else if(lst->next == NULL) { + cell* nex = malloc(sizeof(cell)); + nex->area = area ; + nex->chx = chx ; + nex->chy = chy ; + nex->next = NULL ; + lst->next = nex ; + } else { + linkedList_add(lst->next, chx, chy, area) ; + } +} + +void linkedList_free(linkedList lst) { + // frees rooms as well (require all created rooms to be there) + if(lst != NULL) { + linkedList_free(lst->next); + free(lst->area); + free(lst); + } +} + +// ------------------------------------------------------------------------------------------------------- // + int cantor(int x, int y) { return ((x + y) * (x + y + 1) / 2) + y; } @@ -32,165 +89,51 @@ int generate_hash(int x, int y) { return cantor(x, y); } -void freeGrid(Grid grid) { - for (int i = 0; i < grid->capacity; i++) { - List list = grid->data[i]; - while (list != NULL) { - List next = list->next; - free(list); - list = next; - } +hashtbl hashtbl_generate(int initial_size) { + hashtbl h = malloc(sizeof(hashtbl_0)); + h->insertedElts = 0 ; + h->tabLength = initial_size ; + h->maxInserted = initial_size/2 ; + h->tab = malloc(sizeof(linkedList)*initial_size) ; + for(int k = 0; k < initial_size; k++) { + h->tab[k] = NULL ; } - free(grid->data); - free(grid); + return h ; } -void subGridInsert(Grid grid, int hash, chunk* elt, int x, int y) { - int index = hash % grid->capacity; - //printf(" inserting at index [%d]", index); - List* data = grid->data; - if (data[index] == NULL) { - //printf(" <-->\n"); - List list = malloc(sizeof(struct List)); - list->hash = hash; - list->x = x; - list->y = y; - list->elt = elt; - list->next = NULL; - grid->size++; - data[index] = list; +bool hashtbl_mem(hashtbl tbl, int chx, int chy) { + int id = generate_hash(chx, chy)%(tbl->tabLength) ; + return linkedList_mem(tbl->tab[id], chx, chy) ; +} + +room hashtbl_find(hashtbl tbl, int chx, int chy) { + int id = generate_hash(chx, chy)%(tbl->tabLength) ; + return linkedList_find(tbl->tab[id], chx, chy) ; +} + +room* hashtbl_find_opt(hashtbl tbl, int chx, int chy) { + int id = generate_hash(chx, chy)%(tbl->tabLength) ; + return linkedList_find_opt(tbl->tab[id], chx, chy) ; +} + +void hashtbl_add(hashtbl tbl, int chx, int chy, room* area) { + int id = generate_hash(chx, chy)%(tbl->tabLength) ; + tbl->insertedElts += 1 ; + if(tbl->tab[id] != NULL) { + linkedList_add(tbl->tab[id], chx, chy, area); } else { - //printf(" <>\n"); - List list = data[index]; - while (list->next != NULL && list->hash != hash) { - list = list->next; - }; - //printf(" <>\n"); - if (list->x == x && list->y == y) { - list->elt = elt; - } else { - List nex = malloc(sizeof(struct List)); - nex->hash = hash; - nex->x = x; - nex->y = y; - nex->elt = elt; - nex->next = NULL; - list->next = nex; - grid->size++; - } + linkedList nex = malloc(sizeof(cell)); + nex->area = area ; + nex->chx = chx ; + nex->chy = chy ; + nex->next = NULL ; + tbl->tab[id] = nex ; } } -void gridInsert(Grid grid, int x, int z, chunk* elt) { - if (grid->size >= grid->capacity * grid->loadFactor) { - grid->size = 0; - grid->capacity *= 2; - - printf("resizing\n"); - - List* old_data = grid->data; - grid->data = malloc(sizeof(List) * grid->capacity);; - for (int i = 0; i < grid->capacity; i++) { - grid->data[i] = NULL; - }; - for (int i = 0; i < grid->capacity/2; i++) { - List list = old_data[i]; - while (list != NULL) { - subGridInsert(grid, list->hash, list->elt, list->x, list->y); - list = list->next; - } - } - }; - - int hash = generate_hash(x, z); - subGridInsert(grid, hash, elt, x, z); -} - -chunk* gridGet(Grid grid, int x, int z) { - int hash = generate_hash(x, z); - int index = hash % grid->capacity; - List list = grid->data[index]; - while (list != NULL && (list->x != x || list->y != z)) { - list = list->next; +void hashtbl_free(hashtbl tbl) { + for(int k = 0; k < tbl->tabLength; k++) { + free(tbl->tab[k]); } - if (list == NULL) { - return NULL; - } - return list->elt; -} - -bool gridMem(Grid grid, int x, int z) { - int hash = generate_hash(x, z); - int index = hash % grid->capacity; - List list = grid->data[index]; - while (list != NULL && (list->x != x || list->y != z)) { - list = list->next; - } - if (list == NULL) { - return false; - } - return true; -} - -chunk* gridRemove(Grid grid, int x, int z) { - int hash = generate_hash(x, z); - int index = hash % grid->capacity; - List list = grid->data[index]; - List prev = NULL; - while (list != NULL && list->hash != hash) { - prev = list; - list = list->next; - } - if (list == NULL) { - return NULL; - } - chunk* elt = list->elt; - if (prev == NULL) { - grid->data[index] = list->next; - } else { - prev->next = list->next; - } - free(list); - grid->size--; - return elt; -} - -Grid newGrid() { - Grid grid = malloc(sizeof(struct Grid)); - grid->data = malloc(sizeof(List) * 800); - grid->size = 0; - grid->capacity = 800; - grid->loadFactor = 0.75; - for (int i = 0; i < grid->capacity; i++) { - grid->data[i] = NULL; - } - grid->push = &gridInsert; - grid->pop = &gridRemove; - grid->get = &gridGet; - grid->mem = &gridMem; - return grid; -} - -chunk** gridIter(Grid grid) { - chunk** array = malloc(sizeof(chunk*) * grid->size); - int index = 0; - for (int i = 0; i < grid->capacity; i++) { - List list = grid->data[i]; - while (list != NULL) { - array[index++] = list->elt; - list = list->next; - } - } - return array; -} - -ChunkCoord newChunkCoord(int x, int z) { - ChunkCoord coord = malloc(sizeof(struct ChunkCoord)); - coord->x = x; - coord->z = z; - return coord; -} - -void freeChunkCoord(ChunkCoord coord) { - free(coord); -} + free(tbl); +} \ No newline at end of file diff --git a/src/hash.h b/src/hash.h index 453276b..c939aea 100644 --- a/src/hash.h +++ b/src/hash.h @@ -1,75 +1,26 @@ // credit to Benoit // -#ifndef GRID_H -#define GRID_H +// (int * int) -> room* + +#ifndef HASH_H +#define HASH_H +#include "structure.h" #include -typedef struct linkedList { - uint8_t coord ; // coord%8 = x ; coord/16 = y - char* flag ; - struct linkedList* next ; -} linkedList ; - -typedef struct template { - uint8_t id ; - uint8_t* lines ; // len = 8 - - bool checkCompat ; - - uint8_t eastsig ; - uint8_t westsig ; - - linkedList* meta ; -} template ; - -typedef struct chunk { - int16_t chx ; - int16_t chy ; - - int draw_id ; - - template chdata ; -} chunk ; - -// - -typedef struct List { - int hash; - int x; - int y; - chunk* elt; - struct List* next; -} *List; - -typedef struct Grid { - List* data; - int capacity; - int size; - double loadFactor; - void (*push)(struct Grid *grid, int x, int z, chunk* elt); - chunk* (*pop)(struct Grid *grid, int x, int z); - chunk* (*get)(struct Grid *grid, int x, int z); - bool (*mem)(struct Grid *grid, int x, int z); -} *Grid; +bool linkedList_mem(linkedList lst, int chx, int chy); +room linkedList_find(linkedList lst, int chx, int chy); +room* linkedList_find_opt(linkedList lst, int chx, int chy); +void linkedList_add(linkedList lst, int chx, int chy, room* area); +void linkedList_free(linkedList lst); +int cantor(int x, int y); int generate_hash(int x, int y); -Grid newGrid(); -void freeGrid(Grid grid); - -void gridInsert(Grid grid, int x, int z, chunk* elt); -chunk* gridGet(Grid grid, int x, int z); -bool gridMem(Grid grid, int x, int z); -chunk* gridRemove(Grid grid, int x, int z); - -chunk** gridIter(Grid grid); - -typedef struct ChunkCoord { - int x; - int z; -} *ChunkCoord; - -ChunkCoord newChunkCoord(int x, int z); -void freeChunkCoord(ChunkCoord coord); +hashtbl hashtbl_generate(int initial_size); +bool hashtbl_mem(hashtbl tbl, int chx, int chy); +room hashtbl_find(hashtbl tbl, int chx, int chy); +room* hashtbl_find_opt(hashtbl tbl, int chx, int chy); +void hashtbl_add(hashtbl tbl, int chx, int chy, room* area); +void hashtbl_free(hashtbl tbl); #endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 4874e5b..5b79a52 100644 --- a/src/main.c +++ b/src/main.c @@ -34,6 +34,7 @@ int main(int argc, char** argv) { Uint32 render_flags = SDL_RENDERER_ACCELERATED; SDL_Renderer* rend = SDL_CreateRenderer(win, -1, render_flags); SDL_SetRenderDrawBlendMode(rend, SDL_BLENDMODE_BLEND); + //-------------------------------------------------------------------------------// if(SDL_Init(SDL_INIT_AUDIO)) { diff --git a/src/move.c b/src/move.c index 52c79b0..32c251e 100644 --- a/src/move.c +++ b/src/move.c @@ -67,16 +67,18 @@ void playerActions() { has_changed = true ; switch (event.key.keysym.sym) { case SDLK_z: - camz += speed*cos(rot_hz); - camx -= speed*sin(rot_hz); + camz += speed*cos(rot_hz)*cos(rot_vt); + camx -= speed*sin(rot_hz)*cos(rot_vt); + camy += speed*sin(rot_vt); break; case SDLK_q: camx -= speed*cos(rot_hz); camz -= speed*sin(rot_hz); break; case SDLK_s: - camz -= speed*cos(rot_hz); - camx += speed*sin(rot_hz); + camz -= speed*cos(rot_hz)*cos(rot_vt); + camx += speed*sin(rot_hz)*cos(rot_vt); + camy -= speed*sin(rot_vt); break; case SDLK_d: camx += speed*cos(rot_hz); diff --git a/src/structure.h b/src/structure.h index 2abb785..624d31c 100644 --- a/src/structure.h +++ b/src/structure.h @@ -20,6 +20,43 @@ struct cube_0 { typedef struct cube_0 cube_0 ; typedef cube_0* cube ; +typedef struct teleporter { + cube_0 hitbox ; + int dest_chx ; + int dest_chy ; + double dest_x ; + double dest_y ; +} teleporter ; + +struct room { + // (0, 0, 0) = bottom, left and down + int chunk_x ; + int chunk_y ; + cube* map ; +} ; +typedef struct room room ; + +struct cell { + int chx ; + int chy ; + room* area ; + struct cell* next ; +} ; + +typedef struct cell cell ; +typedef struct cell* linkedList ; + +struct hashtbl_0 { + int tabLength ; + int insertedElts ; + int maxInserted ; + linkedList* tab ; +} ; +typedef struct hashtbl_0 hashtbl_0 ; +typedef hashtbl_0* hashtbl ; + +// ------------------------------------------------ // + extern imgs digits ; extern imgs letters ; @@ -34,4 +71,6 @@ extern double tan_fov ; extern bool has_changed ; +extern hashtbl visited ; + #endif \ No newline at end of file