summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@amftech.nl>2023-12-25 11:38:41 +0100
committerAldrik Ramaekers <aldrik@amftech.nl>2023-12-25 11:38:41 +0100
commit655ad2a85235a215dbcdf1753bdcccaa2308b529 (patch)
treecbe340289209eb338c0fb2ca2a303b69dafd2c79 /src
parentca7d3a7bb8a98c6dd5c00a6dca84921948f71229 (diff)
area selection editor
Diffstat (limited to 'src')
-rw-r--r--src/editor.c30
-rw-r--r--src/objects.c8
2 files changed, 33 insertions, 5 deletions
diff --git a/src/editor.c b/src/editor.c
index 5a15870..5166cc1 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -255,21 +255,27 @@ typedef enum t_object_editor_state {
OBJECT_EDITOR_PLACING,
} object_editor_state;
-object_editor_state object_edit_state = OBJECT_EDITOR_PLACING;
+object_editor_state object_edit_state = OBJECT_EDITOR_SELECTING;
object_type object_to_place = OBJECT_NONE;
-
+vec2 select_start = {0,0};
+vec2 select_end = {0,0};
+static bool is_selecting = false;
void update_object_editor(platform_window* window) {
map_info info = get_map_info(window);
vec2 pos = screen_pos_to_world_pos(window, _global_mouse.x, _global_mouse.y);
+ if (keyboard_is_key_down(KEY_ESCAPE)) {
+ object_edit_state = OBJECT_EDITOR_SELECTING;
+ }
+
if (pos.x < 0 || pos.y < 0) return;
if (pos.x >= loaded_map.width || pos.y >= loaded_map.height) return;
switch (object_edit_state)
{
case OBJECT_EDITOR_PLACING:
- if (is_left_down()) {
+ if (is_left_clicked()) {
object obj = object_dict[object_to_place-1];
obj.position.x = pos.x;
obj.position.y = pos.y;
@@ -287,7 +293,16 @@ void update_object_editor(platform_window* window) {
case OBJECT_EDITOR_SELECTING:
if (is_left_clicked()) {
-
+ select_start = pos;
+ select_end = pos;
+ is_selecting = true;
+ }
+ if (is_selecting && is_left_down()) {
+ select_end = pos;
+ }
+ if (is_selecting && is_left_released()) {
+ select_end = pos;
+ is_selecting = false;
}
break;
@@ -315,6 +330,13 @@ void draw_object_panel(platform_window* window) {
object_edit_state = OBJECT_EDITOR_PLACING;
}
}
+
+ if (object_edit_state == OBJECT_EDITOR_SELECTING)
+ {
+ vec2f start = world_pos_to_screen_pos(window, select_start.x, select_start.y, 0);
+ vec2f end = world_pos_to_screen_pos(window, select_end.x - select_start.x, select_end.y - select_start.y, 0);
+ renderer->render_rectangle(start.x, start.y, end.x, end.y, rgba(255,0,0,100));
+ }
}
diff --git a/src/objects.c b/src/objects.c
index 2084b4d..2723fed 100644
--- a/src/objects.c
+++ b/src/objects.c
@@ -39,6 +39,12 @@ object get_object_at_tile(float x, float y) {
}
void add_object(object obj) {
+ object existing_obj = get_object_at_tile(obj.position.x, obj.position.y);
+ if (existing_obj.active) {
+ log_info("Space occupied, cannot place object.");
+ return;
+ }
+
for (int i = 0; i < MAX_OBJECTS; i++) {
object o = map_to_load.objects[i];
if (o.active) continue;
@@ -46,7 +52,7 @@ void add_object(object obj) {
map_to_load.objects[i].active = true;
return;
}
- log_info("OBJECT LIMIT REACHED!");
+ log_info("Object limit reached.");
}
image* get_image_from_objecttype(object_type tile) {