From 925645ecb3a88894928a9377034fde5944b779e3 Mon Sep 17 00:00:00 2001 From: ac-stef Date: Sat, 17 Sep 2016 01:01:40 +0200 Subject: [PATCH] new custom arch prefab editor The menu lists all prefab arches and allows to edit them with sliders. Arches can be saved and restored. "archvertex" now returns the old value of the vertex, and if the vertex argument is omitted, doesn't change it. enumalias prefix Lists all persistent aliases that start with prefix. Returns a table with two entries per alias: 1) full name and 2) name without prefix DOCREF archvertex enumalias --- config/menus_edit.cfg | 34 ++++++++++++++++++++++++++++++++++ source/src/command.cpp | 14 ++++++++++++++ source/src/editing.cpp | 7 ++++--- source/src/worldio.cpp | 2 +- 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/config/menus_edit.cfg b/config/menus_edit.cfg index 3cd3f4b4..ad68802f 100644 --- a/config/menus_edit.cfg +++ b/config/menus_edit.cfg @@ -100,6 +100,7 @@ newmenu Arches menuinit [ chmenutexture (curmenu) map_editor/axes.png " " ] menuitemslider "Arch sideways curve delta: " 0 5 "$__archside" 1 [] [ __archside = $arg1 ] menuitem "\t[ Place arch ]" [ __setundoarch ; heightfield 2; arch $__archside ] +menuitem "Edit arches..." [ showmenu "Edit arches" ] menuitem "" -1 menuitemslider "Slope axis: " 0 1 "$__slopeaxis" 1 ["West to East (X)" "North to South (Y)"] [ __slopeaxis = $arg1 ] menuitemslider "Slope increment: " 0 5 "$__slopeinc" 1 ["downwards 3" "downwards 2" "downwards 1" "upwards 1" "upwards 2" "upwards 3"] [ __slopeinc = $arg1 ] @@ -112,6 +113,39 @@ menuitemslider "Stairs axis: " 0 1 "$__stairaxis" 1 ["West to East (X)" "North menuitemslider "Step width: " 0 5 "$__stairwidth" 1 ["downwards 3" "downwards 2" "downwards 1" "upwards 1" "upwards 2" "upwards 3"] [ __stairwidth = $arg1 ] menuitem "\t[ Place stairs ]" [ push i (at "-3 -2 -1 1 2 3" $__stairwidth) ; stairs (if $__stairaxis 0 $i) (if $__stairaxis $i 0) ; pop i ; 0] +tempalias __pickarch 2 +tempalias __listarch [ push ii "" ; loop i $arg1 [ if $i [ ii = (concat $ii (archvertex $arg1 $i)) ] ] ; result (pop ii) ] +newmenu "Edit arches" +menuinit [ + resetcurmenu + loop i 50 [ + if (> $i 1) [ + menuitem (concatword "arch width " $i ": " (__listarch $i)) (concat __pickarch = $i "; showmenu [Edit arch]") + ] + ] +] + +newmenu "Edit arch" +menuinit [ + resetcurmenu + menuheader "" (concat "edit arch width" $__pickarch) + push ii "" + loop i (div $__pickarch 2) [ + ii = (+ $i 1) + menuitemslider (concat vertex $ii "\t") 0 31 (archvertex $__pickarch $ii) 1 [] (concat archvertex $__pickarch $ii "$arg1 ; archvertex" $__pickarch (- $__pickarch $ii) "$arg1") + ] + pop ii + menuitem "" -1 + tempalias __archname custom + looplist (enumalias (concatword _arch_ $__pickarch _)) [fn sn] [ + if (= (+ (listlen $$fn) 1) $__pickarch) [ + __archname = $sn + menuitem (concat restore $sn " " $$fn) (concat av (- $__pickarch 1) (escape $$fn)) + ] + ] + menuitemtextinput "save arch as " "result $__archname" (concat __archname "= $arg1 ; (concatword _arch_"$__pickarch "_ $arg1) = (__listarch" $__pickarch ")" ) "" 250 +] + newmenu skymaps menuinit [ resetcurmenu diff --git a/source/src/command.cpp b/source/src/command.cpp index 5a53f6ba..dcb6d5e7 100644 --- a/source/src/command.cpp +++ b/source/src/command.cpp @@ -1573,6 +1573,20 @@ COMMANDF(escape, "s", (const char *s) { result(escapestring(s));}); int sortident(ident **a, ident **b) { return strcasecmp((*a)->name, (*b)->name); } +void enumalias(char *prefix) +{ + vector res; + vector sids; + size_t np = strlen(prefix); + enumerate(*idents, ident, id, if(id.type == ID_ALIAS && id.persist && !id.isconst && !id.istemp && !strncmp(id.name, prefix, np)) sids.add(&id); ); + sids.sort(sortident); + loopv(sids) cvecprintf(res, "%s %s\n", sids[i]->name, sids[i]->name + np); + if(res.length()) res.last() = '\0'; + else res.add('\0'); + result(res.getbuf()); +} +COMMAND(enumalias, "s"); + VARP(omitunchangeddefaults, 0, 0, 1); VAR(groupvariables, 0, 4, 10); diff --git a/source/src/editing.cpp b/source/src/editing.cpp index 439b17b1..da75b542 100644 --- a/source/src/editing.cpp +++ b/source/src/editing.cpp @@ -891,7 +891,7 @@ const int MAXARCHVERT = 50; int archverts[MAXARCHVERT][MAXARCHVERT]; bool archvinit = false; -void archvertex(int *span, int *vert, int *delta) +void archvertex(int *span, int *vert, char *delta) { if(!archvinit) { @@ -899,9 +899,10 @@ void archvertex(int *span, int *vert, int *delta) loop(s,MAXARCHVERT) loop(v,MAXARCHVERT) archverts[s][v] = 0; } if(*span>=MAXARCHVERT || *vert>=MAXARCHVERT || *span<0 || *vert<0) return; - archverts[*span][*vert] = *delta; + intret(archverts[*span][*vert]); + if(*delta) archverts[*span][*vert] = ATOI(delta); } -COMMAND(archvertex, "iii"); +COMMAND(archvertex, "iis"); void archxy(int sidedelta, int *averts, block &sel) { diff --git a/source/src/worldio.cpp b/source/src/worldio.cpp index 572d5b48..250442ac 100644 --- a/source/src/worldio.cpp +++ b/source/src/worldio.cpp @@ -1048,7 +1048,7 @@ int load_world(char *mname) // still supports all map formats that have e alias("gametimestart", startmillis, true); startmap(mname); res |= mapconfigerror; - if(res) conoutf("\f3unresolved problems occured during load_world(), warning: 0x%x", res); + if(res) conoutf("\f3unresolved problems occurred during load_world(), warning: 0x%x", res); return res; // negative: error (no map loaded), zero: no problem, positive: some problems (bitmask value) }