diff --git a/README.md b/README.md index 0633a4b..26b1e11 100644 --- a/README.md +++ b/README.md @@ -1 +1,8 @@ -Ever wished you could make your own mario party board ? \ No newline at end of file +Ever wished you could make your own mario party board ? +---| Editor commands |--- +> 1, 2, 3, 4 : go to next cell +> 0, 9, 8, 7 : go to previous cell +> p : add new cell +> l : link cells +> r (press twice) : remove cell +> TAB : exit current menu / close window \ No newline at end of file diff --git a/bin/mamaker b/bin/mamaker index 67509b1..dbf0e36 100755 Binary files a/bin/mamaker and b/bin/mamaker differ diff --git a/src/edit.c b/src/edit.c index df3260b..c1c346e 100644 --- a/src/edit.c +++ b/src/edit.c @@ -74,6 +74,22 @@ void unlink_cells(cell* parent, cell* child) { }; } +cell* redirect_cell(cell* cl) { + if(cl != NULL) { + if(cl->prev_1 != NULL) { + return cl->prev_1; + } else if(cl->prev_2 != NULL) { + return cl->prev_2; + } else if(cl->prev_3 != NULL) { + return cl->prev_3; + } else if(cl->prev_4 != NULL) { + return cl->prev_4; + } else { + fprintf(stderr, "Unable to redirect cell : no parent.\n"); + } + } +} + void append_cell(int cell_type, int X, int Y, cell* parent) { cell* new = malloc(sizeof(cell)); new->id = parent->id; // mostly for parkour @@ -109,20 +125,24 @@ void append_cell_orthogonal(int cell_type, char dir, cell* parent) { } } -void destroy_cell(cell* cl) { - unlink_cells(cl, cl->next_1); - unlink_cells(cl, cl->next_2); - unlink_cells(cl, cl->next_3); - unlink_cells(cl, cl->next_4); +void destroy_cell() { + cell* new_current = redirect_cell(current); - unlink_cells(cl->prev_1, cl); - unlink_cells(cl->prev_2, cl); - unlink_cells(cl->prev_3, cl); - unlink_cells(cl->prev_4, cl); + unlink_cells(current, current->next_1); + unlink_cells(current, current->next_2); + unlink_cells(current, current->next_3); + unlink_cells(current, current->next_4); - cell_count[(int)cl->type] -= 1; + unlink_cells(current->prev_1, current); + unlink_cells(current->prev_2, current); + unlink_cells(current->prev_3, current); + unlink_cells(current->prev_4, current); - free(cl); + cell_count[(int)current->type] -= 1; + + free(current); + + current = new_current ; } bool isAdding = false ; @@ -132,6 +152,17 @@ int phase = 0 ; int editCellType = 0 ; int editDirection = 0 ; +// -------------------------------- // + +bool isLinking = false ; +cell* par ; +cell* chd ; + +// -------------------------------- // + +bool confirmRemove = false ; +bool cooldownRemove = false ; + void playerEditActions(bool* finished) { SDL_Event event; while(SDL_PollEvent(&event)) { @@ -139,6 +170,11 @@ void playerEditActions(bool* finished) { case SDL_QUIT: break; case SDL_KEYDOWN: + if(cooldownRemove) { + cooldownRemove = false; + } else { + confirmRemove = false ; + }; switch (event.key.keysym.sym) { case SDLK_1: if(!isAdding && current->next_1 != NULL) { @@ -215,7 +251,7 @@ void playerEditActions(bool* finished) { editBuffer += 5; }; break; - case SDLK_MINUS: + case SDLK_BACKSPACE: if (isAdding) { editBuffer = editBuffer / 10; }; @@ -239,19 +275,59 @@ void playerEditActions(bool* finished) { dir = 'w'; }; append_cell_orthogonal(editCellType, dir, current); - printf("exit adding...\n"); }; phase += 1; editBuffer = 0; + } + else if(isLinking) { + if(phase == 0) { + par = current ; + } else if(phase == 1) { + if(current != par) { + chd = current; + link_cells(par, chd); + phase = -1; + isLinking = false; + } else { + phase -= 1; + } + }; + phase += 1; }; break; case SDLK_p: - isAdding = true ; - phase = 0 ; - printf("now adding...\n"); + if(!isLinking) { + isAdding = true ; + phase = 0 ; + printf("now adding...\n"); + }; + break; + case SDLK_l: + if(!isAdding) { + isLinking = true; + phase = 0 ; + printf("now linking...\n"); + }; + break; + case SDLK_r: + if(!confirmRemove) { + confirmRemove = true ; + cooldownRemove = true ; + } else { + destroy_cell(); + confirmRemove = false ; + cooldownRemove = false ; + }; break; case SDLK_TAB: - *finished = true; + if(isAdding || isLinking || confirmRemove) { + isAdding = false; + isLinking = false; + confirmRemove = false; + cooldownRemove = false ; + } else { + *finished = true; + }; break; } } @@ -284,6 +360,7 @@ void edit_main(SDL_Renderer* renderer) { resetRenderer(renderer); draw_board(renderer, current->coord_x - tile_size * 7, current->coord_x + tile_size * 7, current->coord_y - tile_size * 7, current->coord_y + tile_size * 7, current); if(isAdding) { + drawStringToRenderer(renderer, letters, "add cell", 50, __height__ - 50, 75/2, 105/2); if(phase == 0) { drawStringToRenderer(renderer, letters, "choose type", 50, 50, 75/2, 105/2); draw_types(renderer); @@ -292,6 +369,16 @@ void edit_main(SDL_Renderer* renderer) { draw_directions(renderer); }; drawNumberToRenderer(renderer, digits, editBuffer, 50, 150, 75/2, 105/2, 0); + } + else if(isLinking) { + drawStringToRenderer(renderer, letters, "link cells", 50, __height__ - 50, 75/2, 105/2); + if(phase == 0) { + drawStringToRenderer(renderer, letters, "choose parent", 50, 50, 75/2, 105/2); + } else { + drawStringToRenderer(renderer, letters, "choose child", 50, 50, 75/2, 105/2); + } + } else if(confirmRemove) { + drawStringToRenderer(renderer, letters, "press r again to remove", 50, __height__ - 50, 75/2, 105/2); }; updateRenderer(renderer); playerEditActions(&finished); diff --git a/src/edit.h b/src/edit.h index 97c467c..7178644 100644 --- a/src/edit.h +++ b/src/edit.h @@ -5,9 +5,11 @@ void link_cells(cell* parent, cell* child); void unlink_cells(cell* parent, cell* child); +cell* redirect_cell(cell* cl); + void append_cell(int cell_type, int X, int Y, cell* parent); -void destroy_cell(cell* cl); +void destroy_cell(); void playerEditActions(bool* finished);