diff --git a/CMakeLists.txt b/CMakeLists.txt index 38e75f4..8024313 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,6 +274,10 @@ add_executable(my_rpg src/systems/dialog_manager.c src/map_editor/map_interactions.c src/map_editor/brush_component.c + src/map_editor/selectors.c + src/map_editor/toolbar.c + src/components/game_display.c + src/systems/game_display_system.c include/map_editor.h ) diff --git a/Makefile b/Makefile index 0dfff26..bc4ea95 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,9 @@ SRC = src/main.c \ src/systems/controllers/keyboard_controller_system.c \ src/map_editor/map_interactions.c \ src/map_editor/tile_collision_manager.c \ - src/map_editor/brush_component.c + src/map_editor/brush_component.c \ + src/map_editor/selectors.c \ + src/map_editor/toolbar.c OBJ = $(SRC:%.c=%.o) diff --git a/assets/ui/reset.png b/assets/ui/reset.png new file mode 100644 index 0000000..a3086d2 Binary files /dev/null and b/assets/ui/reset.png differ diff --git a/assets/ui/rotate.png b/assets/ui/rotate.png new file mode 100644 index 0000000..03f5c9c Binary files /dev/null and b/assets/ui/rotate.png differ diff --git a/assets/ui/texture.png b/assets/ui/texture.png new file mode 100644 index 0000000..fcde006 Binary files /dev/null and b/assets/ui/texture.png differ diff --git a/assets/ui/tile_select.png b/assets/ui/tile_select.png new file mode 100644 index 0000000..937f6f4 Binary files /dev/null and b/assets/ui/tile_select.png differ diff --git a/assets/ui/up_down.png b/assets/ui/up_down.png new file mode 100644 index 0000000..c56e6a2 Binary files /dev/null and b/assets/ui/up_down.png differ diff --git a/assets/ui/vertex_select.png b/assets/ui/vertex_select.png new file mode 100644 index 0000000..f15e04b Binary files /dev/null and b/assets/ui/vertex_select.png differ diff --git a/include/components/game_display.h b/include/components/game_display.h new file mode 100644 index 0000000..90609ac --- /dev/null +++ b/include/components/game_display.h @@ -0,0 +1,24 @@ +// +// Created by anonymus-raccoon on 3/3/20. +// + +#ifndef _TEAMS_COMPONENT_C_ +#define _TEAMS_COMPONENT_H_ + +#include "component.h" + +typedef enum display_type +{ + SELECT_TILE_DISPLAY +} display_type_enum; + +struct game_display +{ + gc_component base; + display_type_enum type; +}; + +const struct game_display game_display; +const struct gc_system game_display_system; + +#endif //_TEAMS_COMPONENT_C_ diff --git a/include/map_editor.h b/include/map_editor.h new file mode 100644 index 0000000..34f0140 --- /dev/null +++ b/include/map_editor.h @@ -0,0 +1,71 @@ +/* +** EPITECH PROJECT, 2020 +** my_rpg +** File description: +** map_editor.h +*/ + + +#ifndef MY_RPG_MAP_EDITOR_H +#define MY_RPG_MAP_EDITOR_H + +#include "engine.h" +#include "components/vertex_component.h" +#include "keybindings.h" +#include "component.h" +#include + +enum modes_on_tile { + VERTEX_0 = 2, + VERTEX_1 = 4, + VERTEX_2 = 8, + VERTEX_3 = 16, + ALL_VERTICES = 30, + INVERT_ADD_VALUE = 1 +}; + +bool map_onclick(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \ +enum gc_mousekeys key); +bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool up_down(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool reset(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool texture(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool switch_texture(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); + +enum brush +{ + MOVE, + RESET, + ROTATE, + TEXTURE +}; + +struct map_manager_component +{ + gc_component base; + bool tile_mode; + enum brush brush; + void *selected_texture; +}; + +const struct map_manager_component map_manager_component; + +#define ADD_VALUE 10 + +void move_verticies(gc_engine *engine, struct tile *ret, char mode, bool r); +int get_index_nearest_vertex(struct tile *sel, gc_vector2 pos); +struct tile *get_tile_from_pos(struct vertex_component *map, gc_vector2 pos); +bool map_manage_click(gc_engine *engine, int id, gc_vector2 pos); +gc_vector2 gc_vector2_from_coords(float x, float y, float z); +bool is_pos_in_tile(gc_vector2 pos, struct tile *tile); + +#endif //MY_RPG_MAP_EDITOR_H diff --git a/lib/my/src/formaters/ptr_formater.c b/lib/my/src/formaters/ptr_formater.c index bcd0c41..e78259e 100644 --- a/lib/my/src/formaters/ptr_formater.c +++ b/lib/my/src/formaters/ptr_formater.c @@ -10,6 +10,8 @@ #include #include +void print_ptr(void *var); + int ptr_formater(va_list ap, char mod[MODIFIERS_SIZE]) { void *var = va_arg(ap, void *); diff --git a/prefabs/editor_ui.gcprefab b/prefabs/editor_ui.gcprefab new file mode 100644 index 0000000..ae21278 --- /dev/null +++ b/prefabs/editor_ui.gcprefab @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab index 443025a..5ccfbdc 100644 --- a/prefabs/game.gcprefab +++ b/prefabs/game.gcprefab @@ -19,6 +19,13 @@ + + + + + + + @@ -34,6 +41,8 @@ + + diff --git a/src/components/game_display.c b/src/components/game_display.c new file mode 100644 index 0000000..f2161e6 --- /dev/null +++ b/src/components/game_display.c @@ -0,0 +1,59 @@ +/* +** EPITECH PROJECT, 2020 +** DPR +** File description: +** game_stats +*/ + +#include +#include +#include "xml.h" +#include "component.h" +#include "utility.h" +#include "components/game_display.h" +#include + +static void ctr(void *component, va_list args) +{ + struct game_display *cmp = (struct game_display *)component; + + cmp->type = va_arg(args, display_type_enum); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct game_display *cmp = (struct game_display *)component; + struct renderer *rend = GETCMP(entity, renderer); + char *display_type = xml_gettempprop(n, "stats"); + + if (!my_strcmp(display_type, "selected_tile")) { + cmp->type = SELECT_TILE_DISPLAY; + return; + } +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct game_display game_display = { + base: { + name: "game_display", + size: sizeof(struct game_display), + dependencies: (char *[]) { + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/components/map_manager_component.c b/src/components/map_manager_component.c new file mode 100644 index 0000000..4d78460 --- /dev/null +++ b/src/components/map_manager_component.c @@ -0,0 +1,58 @@ +/* +** EPITECH PROJECT, 2020 +** My3D +** File description: +** map_manager_component +*/ + +#include "map_editor.h" +#include "engine.h" +#include "entity.h" +#include "xml.h" +#include "my.h" + + +static void ctr(void *comp, va_list args) +{ + struct map_manager_component *cmp = (struct map_manager_component *)comp; + + cmp->tile_mode = true; + cmp->brush = MOVE; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *comp, node *n) +{ + struct map_manager_component *cmp = (struct map_manager_component *)comp; + void **data = scene->get_data(scene, "tiles", NULL); + + cmp->tile_mode = true; + cmp->brush = MOVE; + if (data) + cmp->selected_texture = data[0]; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct map_manager_component map_manager_component = { + base: { + name: "map_manager_component", + size: sizeof(struct map_manager_component), + dependencies: (char *[]){ + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/game_loader.c b/src/game_loader.c index a712a0c..2c75a02 100644 --- a/src/game_loader.c +++ b/src/game_loader.c @@ -17,6 +17,7 @@ #include "components/controllable_component.h" #include "callbacks.h" #include "components/game_manager.h" +#include "components/game_display.h" #include "my.h" #include "map_editor.h" @@ -36,6 +37,18 @@ const struct callback callbacks[] = { {NULL, NULL} }; +const struct callback map_editor_callbacks[] = { + {"map_manage_click", &map_onclick}, + {"tile_select", &tile_select}, + {"vertex_select", &vertex_select}, + {"up_down", &up_down}, + {"reset", &reset}, + {"rotate", &rotate}, + {"texture", &texture}, + {"switch_texture", &switch_texture}, + {NULL, NULL} +}; + int register_customcmps(gc_engine *engine, bool map_editor) { engine->add_component(engine, &controllable_component); @@ -47,12 +60,17 @@ int register_customcmps(gc_engine *engine, bool map_editor) engine->add_system(engine, new_system(&keyboard_controller_system, engine)); engine->add_component(engine, &game_manager); engine->add_system(engine, new_system(&game_manager_system, engine)); + engine->add_component(engine, &map_manager_component); + engine->add_component(engine, &game_display); + engine->add_system(engine, &game_display_system); engine->finish_physics(engine); for (int i = 0; callbacks[i].func; i++) engine->add_callback(engine, my_strdup(callbacks[i].name), \ callbacks[i].func); if (map_editor) - engine->add_callback(engine, my_strdup("map_manage_click"), &map_onclick); + for (int i = 0; map_editor_callbacks[i].func; i++) + engine->add_callback(engine, \ +my_strdup(map_editor_callbacks[i].name), map_editor_callbacks[i].func); return (0); } diff --git a/src/main_menu.c b/src/main_menu.c index a79c27b..2a0296f 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -10,6 +10,7 @@ #include "scene.h" #include "setup.h" #include "my.h" +#include "prefab.h" bool start_button(gc_engine *engine, gc_entity *entity, gc_vector2 _, \ enum gc_mousekeys __) @@ -21,6 +22,10 @@ enum gc_mousekeys __) return (true); } engine->change_scene(engine, scene); + + if (engine->get_callback(engine, "map_manage_click")) + if (prefab_load(engine, "prefabs/editor_ui.gcprefab") < 0) + my_printf("Couldn't load the map editor's ui.\n"); return (true); } diff --git a/src/map_editor/brush_component.c b/src/map_editor/brush_component.c new file mode 100644 index 0000000..95ab5b0 --- /dev/null +++ b/src/map_editor/brush_component.c @@ -0,0 +1,57 @@ +/* +** EPITECH PROJECT, 2020 +** My3D +** File description: +** map_manager_component +*/ + +#include "map_editor.h" +#include "engine.h" +#include "entity.h" +#include "xml.h" + + +static void ctr(void *comp, va_list args) +{ + struct map_manager_component *cmp = (struct map_manager_component *)comp; + + cmp->tile_mode = true; + cmp->brush = MOVE; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *comp, node *n) +{ + struct map_manager_component *cmp = (struct map_manager_component *)comp; + void **data = scene->get_data(scene, "tiles", NULL); + + cmp->tile_mode = true; + cmp->brush = MOVE; + if (data) + cmp->selected_texture = data[0]; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct map_manager_component map_manager_component = { + base: { + name: "map_manager_component", + size: sizeof(struct map_manager_component), + dependencies: (char *[]){ + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/map_editor/map_interactions.c b/src/map_editor/map_interactions.c new file mode 100644 index 0000000..f501b2a --- /dev/null +++ b/src/map_editor/map_interactions.c @@ -0,0 +1,71 @@ +/* +** EPITECH PROJECT, 2020 +** Gamacon +** File description: +** map_interactions +*/ + +#include "map_editor.h" +#include "components/clickable_component.h" +#include "entity.h" +#include "my.h" +#include +#include "components/transform_component.h" +#include "map_utils.h" +#include + +void click_tile(gc_engine *engine, struct map_manager_component *manager, \ +struct tile *ret, bool is_left) +{ + bool r = manager->brush == RESET; + + switch (manager->brush) { + case ROTATE: + ret->data = (ret->data + (is_left ? 1 : -1U)) % 4; + break; + case TEXTURE: + ret->texture = manager->selected_texture; + break; + case MOVE: + case RESET: + move_verticies(engine, ret, ALL_VERTICES | is_left, r); + break; + } +} + +bool map_onclick(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \ +enum gc_mousekeys key) +{ + printf("Map clicked\n"); + struct vertex_component *map = GETCMP(entity, vertex_component); + struct map_manager_component *m = GETCMP(entity, map_manager_component); + struct transform_component *tc = GETCMP(entity, transform_component); + struct tile *t = get_tile_from_pos(map, gc_vector2_add(pos, tc->position)); + bool r; + int ind; + + if (!map || !m) { + my_printf("map not found\n"); + return (false); + } + r = m->brush == RESET; + if (!t) + return (false); + if (m->tile_mode) + click_tile(engine, m, t, key == GC_LEFT); + else { + ind = get_index_nearest_vertex(t, gc_vector2_add(pos, tc->position)); + move_verticies(engine, t, (int)pow(2, ind + 1) | (key == GC_LEFT), r); + } + return (false); +} + +void move_verticies(gc_engine *engine, struct tile *ret, char mode, bool r) +{ + int val = (mode & INVERT_ADD_VALUE) ? ADD_VALUE : -ADD_VALUE; + + for (int i = 0; i < 4; i++) { + if (mode & (int)pow(2, i + 1)) + ret->corners[i]->z += (r) ? -ret->corners[i]->z : val; + } +} \ No newline at end of file diff --git a/src/map_editor/selectors.c b/src/map_editor/selectors.c new file mode 100644 index 0000000..f09384c --- /dev/null +++ b/src/map_editor/selectors.c @@ -0,0 +1,39 @@ +/* +** EPITECH PROJECT, 2020 +** My3D +** File description: +** selectors +*/ + +#include +#include "map_editor.h" +#include "engine.h" +#include "entity.h" + +bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->tile_mode = true; + return (true); +} + +bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->tile_mode = false; + return (true); +} \ No newline at end of file diff --git a/src/map_editor/toolbar.c b/src/map_editor/toolbar.c new file mode 100644 index 0000000..cc98a5d --- /dev/null +++ b/src/map_editor/toolbar.c @@ -0,0 +1,88 @@ +/* +** EPITECH PROJECT, 2020 +** My3D +** File description: +** toolbar +*/ + +#include +#include "map_editor.h" +#include +#include "engine.h" +#include "entity.h" + +bool up_down(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->brush = MOVE; + return (true); +} + +bool reset(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->brush = RESET; + return (true); +} + +bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->brush = ROTATE; + return (true); +} + +bool texture(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->brush = TEXTURE; + return (true); +} + +bool switch_texture(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + void **data = scene->get_data(scene, "tiles", NULL); + static int index = 0; + void *next = NULL; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + index++; + if (data) + next = data[index % (arraylen((const bool *)data) - 1)]; + manager->selected_texture = next; + return (true); +} \ No newline at end of file diff --git a/src/systems/game_display_system.c b/src/systems/game_display_system.c new file mode 100644 index 0000000..365467c --- /dev/null +++ b/src/systems/game_display_system.c @@ -0,0 +1,62 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** teams_system +*/ + +#include "entity.h" +#include "system.h" +#include +#include "components/game_display.h" +#include "components/game_manager.h" +#include "map_editor.h" +#include "text.h" +#include "components/renderer.h" +#include +#include "sprite.h" + +void display_current_texture(gc_scene *scene, struct renderer *rend) +{ + gc_list *li = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *map; + + if (!li) + return; + map = GETCMP(li->data, map_manager_component); + ((gc_sprite *)rend->data)->texture = map->selected_texture; +} + +static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ +float dtime) +{ + struct game_display *disp = GETCMP(entity, game_display); + struct renderer *rend = GETCMP(entity, renderer); + struct game_manager *manager; + gc_scene *scene = engine->scene; + gc_list *entities = scene->get_entity_by_cmp(scene, "game_manager"); + + if (!entities) + return; + manager = GETCMP(entities->data, game_manager); + if (disp->type == SELECT_TILE_DISPLAY && rend->type == GC_TEXTUREREND){ + display_current_texture(scene, rend); + return; + } +} + +static void destroy(void *system, gc_engine *engine) +{ + (void)system; +} + +const gc_system game_display_system = { + name: "game_display_system", + component_name: "game_display", + size: sizeof(gc_system), + ctr: NULL, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &update_entity, + destroy: &destroy +}; \ No newline at end of file