QoL improvments to editor
This commit is contained in:
parent
7fa8ddf0b2
commit
996347d70a
|
@ -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
|
BIN
bin/mamaker
BIN
bin/mamaker
Binary file not shown.
121
src/edit.c
121
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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue