diff --git a/CMakeLists.txt b/CMakeLists.txt
index 029cc7d..49ba380 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -212,7 +212,7 @@ add_executable(My3D
lib/gamacon/src/sfml_renderer/sfml_init.c
lib/gamacon/src/sfml_renderer/sfml_events.c
lib/gamacon/src/components/isometry/map_managment.c
- lib/gamacon/include/components/map_managment.h
+ lib/gamacon/include/map_managment.h
lib/xmlparser/src/otherget.c
src/options.c
lib/gamacon/src/components/input_component.c
@@ -242,17 +242,17 @@ add_executable(My3D
src/systems/game_manager_system.c
include/systems/game_manager_system.h
lib/gamacon/include/keybindings.h
- lib/gamacon/src/components/isometry/map_interactions.c
- lib/gamacon/include/map_interactions.h
+ src/components/isometry/map_interactions.c
+ include/map_interactions.h
lib/gamacon/include/keybindings.h
lib/gamacon/src/ui/tooltip.c
lib/gamacon/src/components/tooltip_component.c
lib/gamacon/include/components/tooltip_component.h
lib/gamacon/src/systems/tooltip_system.c
- lib/gamacon/src/components/isometry/map_manager_component.c
- lib/gamacon/include/components/isometry/map_manager_component.h
+ src/components/isometry/map_manager_component.c
+ include/components/isometry/map_manager_component.h
lib/gamacon/src/components/isometry/vertex_data_loader.c
- lib/gamacon/include/vertex_data_loader.h src/toolbar.c lib/gamacon/include/callbacks.h)
+ lib/gamacon/include/vertex_data_loader.h src/toolbar.c lib/gamacon/include/callbacks.h src/selectors.c)
add_compile_options(-W -Wall -Wextra -Wshadow)
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/include/components/isometry/map_manager_component.h b/include/components/isometry/map_manager_component.h
new file mode 100644
index 0000000..c6ffec0
--- /dev/null
+++ b/include/components/isometry/map_manager_component.h
@@ -0,0 +1,28 @@
+//
+// Created by anonymus-raccoon on 3/10/20.
+//
+
+#ifndef _MAP_MANAGER_COMPONENT_H_
+#define _MAP_MANAGER_COMPONENT_H_
+
+#include "component.h"
+
+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;
+
+#endif //_MAP_MANAGER_COMPONENT_H_
diff --git a/include/map_interactions.h b/include/map_interactions.h
new file mode 100644
index 0000000..e49d459
--- /dev/null
+++ b/include/map_interactions.h
@@ -0,0 +1,19 @@
+/*
+** EPITECH PROJECT, 2020
+** Gamacon
+** File description:
+** map_interactions
+*/
+
+
+#ifndef MY3D_MAP_INTERACTIONS_H
+#define MY3D_MAP_INTERACTIONS_H
+
+#include "engine.h"
+#include "vertex_component.h"
+#include "keybindings.h"
+
+bool tile_interact(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \
+enum gc_mousekeys key);
+
+#endif //MY3D_MAP_INTERACTIONS_H
diff --git a/include/setup.h b/include/setup.h
index bed6d75..dc82ffb 100644
--- a/include/setup.h
+++ b/include/setup.h
@@ -30,4 +30,5 @@ bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool up_down(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool reset(gc_engine *engine, gc_entity *entity, gc_vector2 _);
-bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _);
\ No newline at end of file
+bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _);
+bool texture(gc_engine *engine, gc_entity *entity, gc_vector2 _);
\ No newline at end of file
diff --git a/lib/gamacon b/lib/gamacon
index 6091223..02861ba 160000
--- a/lib/gamacon
+++ b/lib/gamacon
@@ -1 +1 @@
-Subproject commit 609122329b97306ebd59995f82452b32d0e5e8db
+Subproject commit 02861bab238ff37ecde010902300e81907ebade7
diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab
index 89ec06e..ad52eb0 100644
--- a/prefabs/game.gcprefab
+++ b/prefabs/game.gcprefab
@@ -12,6 +12,7 @@
+
@@ -49,12 +50,13 @@
-
+
+
diff --git a/src/components/isometry/map_interactions.c b/src/components/isometry/map_interactions.c
new file mode 100644
index 0000000..bb09891
--- /dev/null
+++ b/src/components/isometry/map_interactions.c
@@ -0,0 +1,73 @@
+/*
+** EPITECH PROJECT, 2020
+** Gamacon
+** File description:
+** map_interactions
+*/
+
+#include "map_interactions.h"
+#include "clickable_component.h"
+#include "entity.h"
+#include "my.h"
+#include
+#include "components/transform_component.h"
+#include "map_managment.h"
+#include
+#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_tile(engine, ret, ALL_VERTICES | is_left, r);
+ break;
+ }
+}
+
+bool tile_interact(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \
+enum gc_mousekeys key)
+{
+ struct vertex_component *map = GETCMP(entity, vertex_component);
+ struct map_manager_component *manager = GETCMP(entity, map_manager_component);
+ struct tile *ret = get_tile_from_pos(map, pos);
+ bool r = manager->brush == RESET;
+ int ind;
+
+ if (!map || !manager) {
+ my_printf("map not found\n");
+ return (false);
+ }
+ if (!ret)
+ return (false);
+ if (manager->tile_mode)
+ click_tile(engine, manager, ret, key == GC_LEFT);
+ else {
+ ind = get_index_nearest_vertex(ret, pos);
+ move_tile(engine, ret, ((int) pow(2, ind + 1)) | (key == GC_LEFT), r);
+ }
+ return (false);
+}
+
+void move_tile(gc_engine *engine, struct tile *ret, char mode, bool r)
+{
+ int val = (mode & INVERT_ADD_VALUE) ? ADD_VALUE : -ADD_VALUE;
+
+ if (mode & VERTEX_0)
+ ret->corners[0]->z += (r) ? -ret->corners[0]->z : val;
+ if (mode & VERTEX_1)
+ ret->corners[1]->z += (r) ? -ret->corners[1]->z : val;
+ if (mode & VERTEX_2)
+ ret->corners[2]->z += (r) ? -ret->corners[2]->z : val;
+ if (mode & VERTEX_3)
+ ret->corners[3]->z += (r) ? -ret->corners[3]->z : val;
+}
\ No newline at end of file
diff --git a/src/components/isometry/map_manager_component.c b/src/components/isometry/map_manager_component.c
new file mode 100644
index 0000000..e3aff98
--- /dev/null
+++ b/src/components/isometry/map_manager_component.c
@@ -0,0 +1,55 @@
+//
+// Created by anonymus-raccoon on 3/10/20.
+//
+
+#include
+#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 2f7d668..a43bd46 100644
--- a/src/game_loader.c
+++ b/src/game_loader.c
@@ -39,6 +39,7 @@ const struct callback callbacks[] = {
{"up_down", &up_down},
{"reset", &reset},
{"rotate", &rotate},
+ {"texture", &texture},
{NULL, NULL}
};
diff --git a/src/selectors.c b/src/selectors.c
new file mode 100644
index 0000000..8d11502
--- /dev/null
+++ b/src/selectors.c
@@ -0,0 +1,34 @@
+//
+// Created by anonymus-raccoon on 3/11/20.
+//
+
+#include
+#include
+#include "engine.h"
+#include "entity.h"
+
+bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _)
+{
+ 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 _)
+{
+ 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/toolbar.c b/src/toolbar.c
index 9aec35a..057918f 100644
--- a/src/toolbar.c
+++ b/src/toolbar.c
@@ -7,32 +7,6 @@
#include "engine.h"
#include "entity.h"
-bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _)
-{
- 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 _)
-{
- 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);
-}
-
bool up_down(gc_engine *engine, gc_entity *entity, gc_vector2 _)
{
gc_scene *scene = engine->scene;
@@ -70,4 +44,17 @@ bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _)
manager = GETCMP(list->data, map_manager_component);
manager->brush = ROTATE;
return (true);
+}
+
+bool texture(gc_engine *engine, gc_entity *entity, gc_vector2 _)
+{
+ 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);
}
\ No newline at end of file