From 7b65934d000d3f9f05c377a347d69fd651da9970 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Wed, 21 Aug 2024 13:11:04 +0200 Subject: [PATCH] levels can now be saved/loaded with external files --- bin/mamaker | Bin 114424 -> 121760 bytes level.csv | 14 +++++ src/assembly.c | 5 ++ src/base.c | 40 ++++++++++++++ src/base.h | 6 +++ src/consts.h | 14 +++-- src/display.c | 2 + src/edit.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++ src/edit.h | 10 ++++ 9 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 level.csv diff --git a/bin/mamaker b/bin/mamaker index dbf0e3648b020ab86382c0cf29c550dcb83f8bbc..55c0228269bf713b68ebd812f525848fe306a393 100755 GIT binary patch delta 42748 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 qNcq6?M`9J{Z=84e)qsh|Vbp(=@%nK9 delta 37625 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 = 0 ; + start->unique_id = 1 ; start->coord_x = 0 ; start->coord_y = 0 ; start->star_allowed = false ; @@ -434,6 +435,10 @@ void destroy_everything() { free_digits(digits); free_digits(letters); + if(n_loaded != -1) { + free(all_loaded_cells); + }; + printf("Destruction complete!...\n\n"); } diff --git a/src/base.c b/src/base.c index 36a5420..b747781 100644 --- a/src/base.c +++ b/src/base.c @@ -75,4 +75,44 @@ bool is_star_allowed(int ctype) { bool is_hidden_block_allowed(int ctype) { return ((CELLTYPE)ctype == BLUE || (CELLTYPE)ctype == RED) ; +} + +int line_count(char* filename) { + FILE* ptr = fopen(filename, "r"); + char c = 'd'; + + int n = 0 ; + while(c != EOF) { + if(c == '\n') { + n += 1; + }; + c = fgetc(ptr); + }; + fclose(ptr); + return (n+1); +} + +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); +} + +void terminate_line(FILE* ptr) { + char c = fgetc(ptr); + while(c != '\n' && c != EOF) { + c = fgetc(ptr); + } } \ No newline at end of file diff --git a/src/base.h b/src/base.h index 1caccf0..2227d67 100644 --- a/src/base.h +++ b/src/base.h @@ -23,4 +23,10 @@ bool is_star_allowed(int ctype); bool is_hidden_block_allowed(int ctype); +int line_count(char* filename); + +int get_integer(FILE* ptr); + +void terminate_line(FILE* ptr); + #endif \ No newline at end of file diff --git a/src/consts.h b/src/consts.h index aafcb51..9eebdc3 100644 --- a/src/consts.h +++ b/src/consts.h @@ -11,9 +11,11 @@ typedef enum CELLTYPE { CHANCE_TIME, BOO, STAR, - BANK + BANK, + ITEM_SHOP } CELLTYPE ; -static int n_cell_type = 10 ; +static int n_cell_type = 11 ; +// if you want to add another type, add it AT THE VERY END. otherwise it may corrupt existing save files typedef enum ITEM { DOUBLE_DICE, @@ -33,7 +35,8 @@ typedef enum ITEM { static int n_items = 13 ; typedef struct cell { - int id ; // mostly for parkour + int id ; // mostly for drawing + int unique_id ; // save/load int coord_x ; int coord_y ; bool star_allowed ; @@ -110,4 +113,9 @@ static int tile_size = 50 ; extern cell* current ; +extern int edit_cell_count ; + +extern cell** all_loaded_cells ; +extern int n_loaded ; + #endif \ No newline at end of file diff --git a/src/display.c b/src/display.c index e252bbe..278935a 100644 --- a/src/display.c +++ b/src/display.c @@ -138,6 +138,8 @@ long cell_colors(cell* cl) { return (long)(255) + (long)(256)*(long)(255) + (long)(256*256)*(long)(32); case BANK: return (long)(255) + (long)(256)*(long)(255) + (long)(256*256)*(long)(32); + case ITEM_SHOP: + return (long)(220) + (long)(256)*(long)(220) + (long)(256*256)*(long)(220); } } diff --git a/src/edit.c b/src/edit.c index c1c346e..c4b1337 100644 --- a/src/edit.c +++ b/src/edit.c @@ -16,6 +16,11 @@ #include "display.h" #include "edit.h" +int edit_cell_count = 2; + +cell** all_loaded_cells; +int n_loaded = -1; + void link_cells(cell* parent, cell* child) { if(parent != NULL) { if(parent->next_1 == NULL) { @@ -93,6 +98,7 @@ cell* redirect_cell(cell* cl) { void append_cell(int cell_type, int X, int Y, cell* parent) { cell* new = malloc(sizeof(cell)); new->id = parent->id; // mostly for parkour + new->unique_id = edit_cell_count; new->coord_x = X; new->coord_y = Y; new->star_allowed = is_star_allowed(cell_type); @@ -107,6 +113,8 @@ void append_cell(int cell_type, int X, int Y, cell* parent) { new->next_4 = NULL; char* meta = "none"; + edit_cell_count += 1; + link_cells(parent, new); cell_count[cell_type] += 1; } @@ -329,6 +337,17 @@ void playerEditActions(bool* finished) { *finished = true; }; break; + case SDLK_s: + save("level.csv"); + printf("Saved level\n"); + break; + case SDLK_q: + load("level.csv"); + printf("loaded level\n"); + break; + case SDLK_e: + current->type = (CELLTYPE)(((int)current->type +1)%n_cell_type); + break; } } } @@ -345,6 +364,7 @@ void draw_types(SDL_Renderer* renderer) { drawStringToRenderer(renderer, letters, "boo", __width__ - 4 * 75/2, 400, 75/2, 105/2); drawStringToRenderer(renderer, letters, "star", __width__ - 5 * 75/2, 450, 75/2, 105/2); drawStringToRenderer(renderer, letters, "bank", __width__ - 5 * 75/2, 500, 75/2, 105/2); + drawStringToRenderer(renderer, letters, "shop", __width__ - 5 * 75/2, 550, 75/2, 105/2); } void draw_directions(SDL_Renderer* renderer) { @@ -384,4 +404,124 @@ void edit_main(SDL_Renderer* renderer) { playerEditActions(&finished); usleep(20000); } +} + +// save/load level + +void reassign_id_cell(cell* cl, int* current, int common) { + if(cl != NULL && cl->id != 60000) { + cl->unique_id = *current; + *current += 1; + cl->id = 60000; + + reassign_id_cell(cl->next_1, current, common); + reassign_id_cell(cl->next_2, current, common); + reassign_id_cell(cl->next_3, current, common); + reassign_id_cell(cl->next_4, current, common); + } +} + +void reassign_ids() { + int p = 1 ; + reassign_id_cell(start, &p, start->id); +} + +void write_cell(FILE* ptr, cell* cl, int global_id) { + if(cl != NULL && cl->id == global_id) { + printf("saving cell %d\n", cl->unique_id); + cl->id = global_id+1; + + fprintf(ptr, "%d,%d,%d,%d,%d[", cl->unique_id, (int)cl->type, cl->coord_x, cl->coord_y, (int)cl->star_allowed); + printf("%d,%d,%d,%d,%d[", cl->unique_id, (int)cl->type, cl->coord_x, cl->coord_y, (int)cl->star_allowed); + if(cl->next_1 != NULL) { + fprintf(ptr, "%d,", cl->next_1->unique_id); + printf("%d,", cl->next_1->unique_id); + }; + if(cl->next_2 != NULL) { + fprintf(ptr, "%d,", cl->next_2->unique_id); + printf("%d,", cl->next_2->unique_id); + }; + if(cl->next_3 != NULL) { + fprintf(ptr, "%d,", cl->next_3->unique_id); + printf("%d,", cl->next_3->unique_id); + }; + if(cl->next_4 != NULL) { + fprintf(ptr, "%d,", cl->next_4->unique_id); + printf("%d,", cl->next_4->unique_id); + }; + fprintf(ptr, "]\n"); + printf("]\n"); + + write_cell(ptr, cl->next_1, global_id); + write_cell(ptr, cl->next_2, global_id); + write_cell(ptr, cl->next_3, global_id); + write_cell(ptr, cl->next_4, global_id); + } +} + +void save(char* filename) { + reassign_ids(); + FILE* ptr = fopen(filename, "w"); + write_cell(ptr, start, start->id); + fclose(ptr); +} + +// fprintf(ptr, "%d,%d,%d,%d,%d[", cl->unique_id, (int)cl->type, cl->coord_x, cl->coord_y, (int)cl->star_allowed); +void load(char* filename) { + n_loaded = line_count(filename) -1; + all_loaded_cells = malloc(sizeof(cell*)*n_loaded); + + all_loaded_cells[0] = start; + + for(int i = 0; i < n_loaded; i++) { + if(i != 0) { + all_loaded_cells[i] = malloc(sizeof(cell)); + }; + + all_loaded_cells[i]->next_1 = NULL; + all_loaded_cells[i]->next_2 = NULL; + all_loaded_cells[i]->next_3 = NULL; + all_loaded_cells[i]->next_4 = NULL; + + all_loaded_cells[i]->prev_1 = NULL; + all_loaded_cells[i]->prev_2 = NULL; + all_loaded_cells[i]->prev_3 = NULL; + all_loaded_cells[i]->prev_4 = NULL; + }; + + FILE* ptr = fopen(filename, "r"); + + char burn; + printf("Loading %d lines...\n", n_loaded); + + for(int i = 0; i < n_loaded; i++) { + printf("%d\n", i); + int unique = get_integer(ptr); + int a_type = get_integer(ptr); + int cx = get_integer(ptr); + int cy = get_integer(ptr); + int ok_star = get_integer(ptr); + + //printf(" %d, %d, %d, %d, %d\n", unique, a_type, cx, cy, ok_star); + + all_loaded_cells[i]->unique_id = unique; + all_loaded_cells[i]->type = (CELLTYPE)a_type; + all_loaded_cells[i]->coord_x = cx; + all_loaded_cells[i]->coord_y = cy; + all_loaded_cells[i]->star_allowed = (bool)ok_star; + + int current_link = get_integer(ptr); + while(current_link > 0) { + link_cells(all_loaded_cells[i], all_loaded_cells[current_link-1]); + //printf(" linking %d <--> %d", i, current_link -1); + current_link = get_integer(ptr); + }; + + if(i != n_loaded -1) { + terminate_line(ptr); + } + }; + current = start; + edit_cell_count = n_loaded; + fclose(ptr); } \ No newline at end of file diff --git a/src/edit.h b/src/edit.h index 7178644..28f2b5b 100644 --- a/src/edit.h +++ b/src/edit.h @@ -19,4 +19,14 @@ void draw_directions(SDL_Renderer* renderer); void edit_main(SDL_Renderer* renderer); +void reassign_id_cell(cell* cl, int* current, int common); + +void reassign_ids(); + +void write_cell(FILE* ptr, cell* cl, int global_id); + +void save(char* filename); + +void load(char* filename); + #endif