dunger now saves player start position and cell size
[vrlugburz] / tools / dunger / src / main.c
index ed456f7..6bc37a7 100644 (file)
@@ -6,6 +6,7 @@
 #include <drawtext.h>
 #include "level.h"
 #include "lview.h"
+#include "app.h"
 
 static int init(void);
 static void cleanup(void);
@@ -25,6 +26,8 @@ static void cb_save_ok(utk_event *ev, void *data);
 
 static void cb_cancel(utk_event *ev, void *data);
 
+static void cb_toolselect(utk_event *ev, void *data);
+
 static int parse_args(int argc, char **argv);
 
 
@@ -47,7 +50,7 @@ int mousex, mousey, clickx, clicky;
 
 static float uiscale = 1.0f;
 #define UISPLIT        150
-int splitx;
+static int splitx;
 
 #define FONTSZ 16
 static struct dtx_font *uifont;
@@ -55,7 +58,9 @@ static utk_widget *uiroot, *uiwin_new;
 static utk_widget *uigrab;
 static utk_widget *cbox_newsz;
 
-static struct level *lvl;
+static struct level lvl;
+
+static const char *opt_fname;
 
 
 int main(int argc, char **argv)
@@ -125,6 +130,9 @@ static int init(void)
        utk_button(win, "New", 0, 0, cb_new, 0);
        utk_button(win, "Open ...", 0, 0, cb_open, 0);
        utk_button(win, "Save ...", 0, 0, cb_save, 0);
+       utk_label(win, "-- Tools --");
+       utk_radiobox(win, "Draw", 1, cb_toolselect, (void*)TOOL_DRAW);
+       utk_radiobox(win, "Player start", 0, cb_toolselect, (void*)TOOL_PSTART);
 
        uiwin_new = utk_window(uiroot, (win_width - 220) / 2, (win_height - 150) / 2,
                        220, 150, "New level");
@@ -141,11 +149,18 @@ static int init(void)
        utk_set_size(uiwin_new, utk_get_width(vbox) + pad * 2.0f, utk_get_height(vbox) + pad * 2.0f);
 
 
-       if(!(lvl = create_level(32, 32))) {
-               fprintf(stderr, "failed to create level\n");
-               return -1;
+       if(opt_fname) {
+               if(load_level(&lvl, opt_fname) == -1) {
+                       fprintf(stderr, "failed to load level: %s\n", opt_fname);
+                       return -1;
+               }
+       } else {
+               if(init_level(&lvl, 32, 32) == -1) {
+                       fprintf(stderr, "failed to create level\n");
+                       return -1;
+               }
        }
-       if(init_lview(lvl) == -1) {
+       if(init_lview(&lvl) == -1) {
                return -1;
        }
 
@@ -159,7 +174,7 @@ static int init(void)
 static void cleanup(void)
 {
        destroy_lview();
-       free_level(lvl);
+       destroy_level(&lvl);
        dtx_close_font(uifont);
        utk_close(uiroot);
 }
@@ -316,21 +331,21 @@ static void cb_new_ok(utk_event *ev, void *data)
 {
        static int levsz[] = {16, 24, 32};
        int sz;
-       struct level *newlvl;
+       struct level newlvl;
 
        sz = levsz[utk_get_selected(cbox_newsz)];
 
-       if(!(newlvl = create_level(sz, sz))) {
+       if(init_level(&newlvl, sz, sz) == -1) {
                utk_message_dialog("failed to create new level", UTK_MSG_TYPE_ERROR,
                                UTK_MSG_BN_OK, cb_cancel, 0);
                return;
        }
 
-       free_level(lvl);
+       destroy_level(&lvl);
        destroy_lview();
 
        lvl = newlvl;
-       init_lview(newlvl);
+       init_lview(&lvl);
 
        utk_hide(uiwin_new);
        uigrab = 0;
@@ -343,10 +358,22 @@ static void cb_open(utk_event *ev, void *data)
 
 static void cb_open_ok(utk_event *ev, void *data)
 {
+       char *errmsg = 0;
+       const char *path;
+
        utk_widget *dlg = utk_event_widget(ev);
-       printf("selected: %s\n", utk_file_dialog_file(dlg));
+       path = utk_file_dialog_path(dlg);
+       printf("selected: %s\n", path);
+       if(load_level(&lvl, path) == -1) {
+               errmsg = alloca(strlen(path) + 32);
+               sprintf(errmsg, "Failed to load level: %s", path);
+       }
        utk_destroy_window(dlg);
        if(uigrab == dlg) uigrab = 0;
+
+       if(errmsg) {
+               uigrab = utk_message_dialog(errmsg, UTK_MSG_TYPE_ERROR, UTK_MSG_BN_OK, cb_cancel, 0);
+       }
 }
 
 static void cb_save(utk_event *ev, void *data)
@@ -356,10 +383,22 @@ static void cb_save(utk_event *ev, void *data)
 
 static void cb_save_ok(utk_event *ev, void *data)
 {
+       char *errmsg = 0;
+       const char *path;
+
        utk_widget *dlg = utk_event_widget(ev);
-       printf("selected: %s\n", utk_file_dialog_file(dlg));
+       path = utk_file_dialog_path(dlg);
+       printf("selected: %s\n", path);
+       if(save_level(&lvl, path) == -1) {
+               errmsg = alloca(strlen(path) + 32);
+               sprintf(errmsg, "Failed to save level file: %s", path);
+       }
        utk_destroy_window(dlg);
        if(uigrab == dlg) uigrab = 0;
+
+       if(errmsg) {
+               uigrab = utk_message_dialog(errmsg, UTK_MSG_TYPE_ERROR, UTK_MSG_BN_OK, cb_cancel, 0);
+       }
 }
 
 static void cb_cancel(utk_event *ev, void *data)
@@ -374,6 +413,14 @@ static void cb_cancel(utk_event *ev, void *data)
        uigrab = 0;
 }
 
+static void cb_toolselect(utk_event *ev, void *data)
+{
+       utk_widget *w = utk_event_widget(ev);
+       if(utk_is_checked(w)) {
+               tool = (intptr_t)data;
+       }
+}
+
 static int parse_args(int argc, char **argv)
 {
        int i;
@@ -396,8 +443,11 @@ static int parse_args(int argc, char **argv)
                                return -1;
                        }
                } else {
-                       fprintf(stderr, "unexpected argument: %s\n", argv[i]);
-                       return -1;
+                       if(opt_fname) {
+                               fprintf(stderr, "unexpected argument: %s\n", argv[i]);
+                               return -1;
+                       }
+                       opt_fname = argv[i];
                }
        }
        return 0;