QoL improvments to editor

This commit is contained in:
Alexandre 2024-08-20 22:28:37 +02:00
parent 7fa8ddf0b2
commit 996347d70a
4 changed files with 115 additions and 19 deletions

View File

@ -1 +1,8 @@
Ever wished you could make your own mario party board ? 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

Binary file not shown.

View File

@ -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) { void append_cell(int cell_type, int X, int Y, cell* parent) {
cell* new = malloc(sizeof(cell)); cell* new = malloc(sizeof(cell));
new->id = parent->id; // mostly for parkour 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) { void destroy_cell() {
unlink_cells(cl, cl->next_1); cell* new_current = redirect_cell(current);
unlink_cells(cl, cl->next_2);
unlink_cells(cl, cl->next_3);
unlink_cells(cl, cl->next_4);
unlink_cells(cl->prev_1, cl); unlink_cells(current, current->next_1);
unlink_cells(cl->prev_2, cl); unlink_cells(current, current->next_2);
unlink_cells(cl->prev_3, cl); unlink_cells(current, current->next_3);
unlink_cells(cl->prev_4, cl); 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 ; bool isAdding = false ;
@ -132,6 +152,17 @@ int phase = 0 ;
int editCellType = 0 ; int editCellType = 0 ;
int editDirection = 0 ; int editDirection = 0 ;
// -------------------------------- //
bool isLinking = false ;
cell* par ;
cell* chd ;
// -------------------------------- //
bool confirmRemove = false ;
bool cooldownRemove = false ;
void playerEditActions(bool* finished) { void playerEditActions(bool* finished) {
SDL_Event event; SDL_Event event;
while(SDL_PollEvent(&event)) { while(SDL_PollEvent(&event)) {
@ -139,6 +170,11 @@ void playerEditActions(bool* finished) {
case SDL_QUIT: case SDL_QUIT:
break; break;
case SDL_KEYDOWN: case SDL_KEYDOWN:
if(cooldownRemove) {
cooldownRemove = false;
} else {
confirmRemove = false ;
};
switch (event.key.keysym.sym) { switch (event.key.keysym.sym) {
case SDLK_1: case SDLK_1:
if(!isAdding && current->next_1 != NULL) { if(!isAdding && current->next_1 != NULL) {
@ -215,7 +251,7 @@ void playerEditActions(bool* finished) {
editBuffer += 5; editBuffer += 5;
}; };
break; break;
case SDLK_MINUS: case SDLK_BACKSPACE:
if (isAdding) { if (isAdding) {
editBuffer = editBuffer / 10; editBuffer = editBuffer / 10;
}; };
@ -239,19 +275,59 @@ void playerEditActions(bool* finished) {
dir = 'w'; dir = 'w';
}; };
append_cell_orthogonal(editCellType, dir, current); append_cell_orthogonal(editCellType, dir, current);
printf("exit adding...\n");
}; };
phase += 1; phase += 1;
editBuffer = 0; 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; break;
case SDLK_p: case SDLK_p:
if(!isLinking) {
isAdding = true ; isAdding = true ;
phase = 0 ; phase = 0 ;
printf("now adding...\n"); 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; break;
case SDLK_TAB: case SDLK_TAB:
if(isAdding || isLinking || confirmRemove) {
isAdding = false;
isLinking = false;
confirmRemove = false;
cooldownRemove = false ;
} else {
*finished = true; *finished = true;
};
break; break;
} }
} }
@ -284,6 +360,7 @@ void edit_main(SDL_Renderer* renderer) {
resetRenderer(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); 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) { if(isAdding) {
drawStringToRenderer(renderer, letters, "add cell", 50, __height__ - 50, 75/2, 105/2);
if(phase == 0) { if(phase == 0) {
drawStringToRenderer(renderer, letters, "choose type", 50, 50, 75/2, 105/2); drawStringToRenderer(renderer, letters, "choose type", 50, 50, 75/2, 105/2);
draw_types(renderer); draw_types(renderer);
@ -292,6 +369,16 @@ void edit_main(SDL_Renderer* renderer) {
draw_directions(renderer); draw_directions(renderer);
}; };
drawNumberToRenderer(renderer, digits, editBuffer, 50, 150, 75/2, 105/2, 0); 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); updateRenderer(renderer);
playerEditActions(&finished); playerEditActions(&finished);

View File

@ -5,9 +5,11 @@ void link_cells(cell* parent, cell* child);
void unlink_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 append_cell(int cell_type, int X, int Y, cell* parent);
void destroy_cell(cell* cl); void destroy_cell();
void playerEditActions(bool* finished); void playerEditActions(bool* finished);