summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/zombies.exebin2100630 -> 2101789 bytes
-rw-r--r--include/objects.h9
-rw-r--r--src/editor.c86
-rw-r--r--src/objects.c11
4 files changed, 79 insertions, 27 deletions
diff --git a/build/zombies.exe b/build/zombies.exe
index f46e6a4..7bd8b70 100644
--- a/build/zombies.exe
+++ b/build/zombies.exe
Binary files differ
diff --git a/include/objects.h b/include/objects.h
index cc66ff0..b4c6a1b 100644
--- a/include/objects.h
+++ b/include/objects.h
@@ -23,6 +23,8 @@ typedef enum t_object_type {
OBJECT_COBBLESTONEWALL1,
OBJECT_PLANTBOX1,
OBJECT_METAL_WALL_FRONT,
+
+ OBJECT_END,
} object_type;
typedef struct t_object {
@@ -44,8 +46,15 @@ typedef struct t_box {
vec2f br_u;
} box;
+object object_dict[OBJECT_END] = {
+ {0,(vec3f){0, 0, 0},{1,1,1},OBJECT_COBBLESTONEWALL1},
+ {0,(vec3f){0, 0, 0},{1,1,2},OBJECT_PLANTBOX1},
+ {0,(vec3f){0, 0, 0},{1,1,1},OBJECT_METAL_WALL_FRONT},
+};
+
object get_object_at_tile(float x, float y);
void create_objects();
+void add_object(object obj);
void draw_objects(platform_window* window);
box get_box_of_object(platform_window* window, object o);
void render_quad_with_outline(vec2f tl, vec2f tr, vec2f bl, vec2f br, color c);
diff --git a/src/editor.c b/src/editor.c
index ce7e277..5a15870 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -25,6 +25,8 @@ int editor_width = 200;
int borderw = 8;
int offset_y = 50;
+static void update_object_editor(platform_window* window);
+
static void update_tile_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);
@@ -89,7 +91,7 @@ void update_editor(platform_window* window)
switch (edit_state)
{
case EDITING_TILES: update_tile_editor(window); break;
- case EDITING_OBJECTS: break;
+ case EDITING_OBJECTS: update_object_editor(window); break;
case EDITING_LIGHTING: break;
}
@@ -247,41 +249,71 @@ void draw_lighting_panel(platform_window* window) {
}
}
-platform_window* window_ptr;
-int cmpfunc_sortobjects (const void * a, const void * b) {
- object* obj1 = (object*)a;
- object* obj2 = (object*)b;
+typedef enum t_object_editor_state {
+ OBJECT_EDITOR_SELECTING,
+ OBJECT_EDITOR_MOVING,
+ OBJECT_EDITOR_PLACING,
+} object_editor_state;
- vec2 cursor_world_pos = screen_pos_to_world_pos(window_ptr, _global_mouse.x, _global_mouse.y);
+object_editor_state object_edit_state = OBJECT_EDITOR_PLACING;
+object_type object_to_place = OBJECT_NONE;
- float dist1 = distance_between_3f(obj1->position, (vec3f){.x = cursor_world_pos.x, .y = cursor_world_pos.y, .z = 0});
- float dist2 = distance_between_3f(obj2->position, (vec3f){.x = cursor_world_pos.x, .y = cursor_world_pos.y, .z = 0});
- return dist1 - dist2;
-}
-void draw_object_panel(platform_window* window) {
- int row_h = 20;
- int offsety = 0;
- window_ptr = window;
+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);
- //qsort(loaded_map.objects, MAX_OBJECTS, sizeof(object), cmpfunc_sortobjects);
+ if (pos.x < 0 || pos.y < 0) return;
+ if (pos.x >= loaded_map.width || pos.y >= loaded_map.height) return;
- for (int i = 0; i < MAX_OBJECTS; i++) {
- object obj = loaded_map.objects[i];
- if (!obj.active) continue;
+ switch (object_edit_state)
+ {
+ case OBJECT_EDITOR_PLACING:
+ if (is_left_down()) {
+ object obj = object_dict[object_to_place-1];
+ obj.position.x = pos.x;
+ obj.position.y = pos.y;
+ obj.active = true;
+ add_object(obj);
+ load_mapdata_into_world();
+ }
+ break;
- renderer->render_rectangle(_global_camera.x, _global_camera.y + offset_y + row_h + offsety, editor_width, row_h, rgba(255,0,0,40));
+ case OBJECT_EDITOR_MOVING:
+ if (is_left_clicked()) {
+
+ }
+ break;
- char buf[50];
- sprintf(buf, "{x: %.0f y: %.0f, z: %.0f}", obj.position.x, obj.position.y, 0);
- renderer->render_text(fnt_20, _global_camera.x, _global_camera.y + offset_y + row_h + offsety + 5, buf, rgb(0,0,0));
+ case OBJECT_EDITOR_SELECTING:
+ if (is_left_clicked()) {
+
+ }
+ break;
+
+ default:
+ break;
+ }
+}
- //vec2f pos = world_pos_to_screen_pos(window, emitter.position.x, emitter.position.y, emitter.position.z);
- //renderer->render_rectangle(pos.x-3, pos.y-3, 36, 36, rgb(100,0,0));
- //renderer->render_rectangle(pos.x, pos.y, 30, 30, rgb(255,0,0));
- //renderer->render_image(img_sunny, pos.x, pos.y, 30, 30);
- offsety+=row_h+1;
+void draw_object_panel(platform_window* window) {
+ int start_y = 1; // rows to skip
+ int cols = 4;
+ int tile_w = editor_width / cols;
+
+ int tile_start = OBJECT_NONE+1;
+ for (int i = tile_start; i < OBJECT_END; i++) {
+ int x = ((i-tile_start) % cols) * tile_w;
+ int y = (start_y + ((i-tile_start) / cols)) * tile_w;
+
+ y += offset_y;
+
+ image* img = get_image_from_objecttype((object_type)i);
+ if (push_icon_button(x, y, tile_w, img, object_to_place == (object_type)i && object_edit_state == OBJECT_EDITOR_PLACING)) {
+ object_to_place = (object_type)i;
+ object_edit_state = OBJECT_EDITOR_PLACING;
+ }
}
}
diff --git a/src/objects.c b/src/objects.c
index 6715e0d..2084b4d 100644
--- a/src/objects.c
+++ b/src/objects.c
@@ -38,6 +38,17 @@ object get_object_at_tile(float x, float y) {
return (object){0};
}
+void add_object(object obj) {
+ for (int i = 0; i < MAX_OBJECTS; i++) {
+ object o = map_to_load.objects[i];
+ if (o.active) continue;
+ map_to_load.objects[i] = obj;
+ map_to_load.objects[i].active = true;
+ return;
+ }
+ log_info("OBJECT LIMIT REACHED!");
+}
+
image* get_image_from_objecttype(object_type tile) {
switch (tile)
{