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 ?
---| 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) {
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:
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:
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);

View File

@ -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);