add todo list for entities

Add some commands to support an entity TODO list. Entity errors during
map load are automatically added to the list. The list is saved and
restored with xmaps. A keybind (no default key assigned) to scroll
through TODO entities was added.

The list is indented as a means for automated map check scripts to
return a list of entities to fix.

cleartodoentities [index]
  Clear list of TODO entities. The list is also deleted, when a new map
  is loaded.
  If an entity number is given as an argument, only entries for this
  entity are cleared.

addtodoentity index comment
  Add the entity #index to the TODO list. Add optional comment.

enumtodoentities
  Returns a list of TODO entities. Returns entity index number and comment
  for every entry.

DOCREF enumtodoentities addtodoentity cleartodoentities
This commit is contained in:
ac-stef
2016-11-05 17:42:30 +01:00
parent 88320bd095
commit e12d25dc95
6 changed files with 110 additions and 11 deletions
+32 -7
View File
@@ -60,16 +60,19 @@ menuitem "\f2\t\t [ OK ]" [ newent light $clight $clight1 $clight2 $clight3 ]
//Entities menu
newmenu Entities
menuitem "RVSF Spawn point" [ newent playerstart 1 ]
menuitem "CLA Spawn point" [ newent playerstart 0 ]
menuitem "FFA Spawn point" [ newent playerstart 100 ]
menuitem "Place RVSF spawn point" [ newent playerstart 1 ]
menuitem "Place CLA spawn point" [ newent playerstart 0 ]
menuitem "Place FFA spawn point" [ newent playerstart 100 ]
menuitemcheckbox "Show all spawn points: " "$showplayerstarts" [ showplayerstarts $arg1 ]
menuitem "" -1
menuitem "RVSF CTF Flag" [ newent ctf-flag 1 ]
menuitem "CLA CTF Flag" [ newent ctf-flag 0 ]
menuitem "Place RVSF CTF Flag" [ newent ctf-flag 1 ]
menuitem "Place CLA CTF Flag" [ newent ctf-flag 0 ]
menuitem "" -1
menuitem "Ladder entity" "saycommand /newent ladder " [ echo "Ensure that you have placed the ladder mapmodel first (found in the mapmodels menu)..." ]
menuitem "Clip entity" [ showmenu Clips ] [ echo Clips can be used to block off areas that players shouldn't be able to access... ]
menuitem "Place ladder entity" "saycommand /newent ladder " [ echo "Ensure that you have placed the ladder mapmodel first (found in the mapmodels menu)..." ]
menuitem "Place clip entity..." [ showmenu Clips ] [ echo Clips can be used to block off areas that players shouldn't be able to access... ]
menuitem "" -1
menuitem "Show list of TODO entities" [ showmenu "TODO entities" ]
menuitem "Show list of deleted entities" [ showmenu "deleted entities" ]
tempalias _clip00 clip; tempalias _clip00status 0; tempalias _clip01 0; tempalias _clip02 1; tempalias _clip03 1; tempalias _clip04 1 // Give aliases an initial value.
@@ -759,6 +762,7 @@ menuitemeditkeyinput [Delete entity: ] editkey_delete_entity
menuitemeditkeyinput [Copy entity: ] copyent
menuitemeditkeyinput [Paste entity: ] pasteent
menuitemeditkeyinput [Edit entity: ] editent
menuitemeditkeyinput [Cycle through TODO entities: ] editkey_scroll_todoents
menuitemeditkeyinput [Cycle through spawns: ] editkey_scroll_spawns
menuitem "" -1
menuitem "\f2Tag clips:" -1
@@ -788,6 +792,27 @@ menuinit [
]
]
// todo entities
newmenu "TODO entities"
menuinit [
resetcurmenu
push h 1
looplisti (enumtodoentities) [n desc] [
if $editing [
menuitem (concatword "Entity #" $n ": \fs\f4" (editentity $n) "\fr " $desc) (concat gotoentity $n "; echo" (escape $desc))
][
menuitem (concatword "Entity #" $n ": " $desc) -1
]
h = 0
]
if (pop h) [
menuitem "no TODO entities" -1
][
menuitem "" -1
menuitem "\f3Clear list of TODO entities" cleartodoentities
]
]
// sort config slots
looplist [__mmsort __mmmerge __texsort __texmerge __sndsort __sndmerge] i [tempalias $i 1]
+1
View File
@@ -65,6 +65,7 @@ alias editkey_tagclip_none [ edittagclip none ]
alias editkey_tagclip_plclip [ edittagclip plclip ]
alias editkey_tagclip_clip [ edittagclip clip ]
alias editkey_scroll_spawns [ domodifier spawns ]
alias editkey_scroll_todoents [ domodifier todoents ]
_defaultbinds 1 // do not save the following binds to saved.cfg
_resetallbinds
+19
View File
@@ -242,6 +242,7 @@ delta_edit_attr5 = [ entproperty 4 $arg2 $editmeta2down ] // Changes the fifth
delta_edit_attr6 = [ entproperty 5 $arg2 $editmeta2down ] // Changes the sixth value on entities...
delta_edit_attr7 = [ entproperty 6 $arg2 $editmeta2down ] // Changes the seventh value on entities...
delta_edit_spawns = [ gotonextplayerstart $arg1 ]
delta_edit_todoents = [ gotonexttodoentity $arg1 ]
delta_game_spawns = []
// Scroll console (in all modes)
@@ -367,6 +368,24 @@ const gotonextplayerstart [
pop n sl
]
// cycle through todo entities
const gotonexttodoentity [
if (&& (!= $arg1 1) (!= $arg1 -1)) [ arg1 = 1 ]
if (! (checkalias __gotonexttodoentity)) [ tempalias __gotonexttodoentity -1 ]
push l (enumtodoentities)
push n (div (listlen $l) 2)
if (&& $n $editing) [
__gotonexttodoentity = (mod (+ $n $n $arg1 $__gotonexttodoentity) $n)
looplisti $l [e desc] [
if (= $i $__gotonexttodoentity) [
gotoentity $e
echo (concatword "TODO entity #" $e ": \fs\f4" (editentity $e) "\fr ") $desc
]
]
]
pop n l
]
// select whole map
const selectall [
select 2 2 (- (powf 2 (mapsize)) 4) (- (powf 2 (mapsize)) 4)
+4
View File
@@ -617,6 +617,10 @@ extern void remipmore(const block &b, int level = 0);
extern bool pinnedclosestent;
extern int closestent();
extern void deletesoundentity(entity &e);
extern vector<int> todoents;
extern vector<char *> todoentdescs;
extern void cleartodoentities(const char *n = NULL);
extern void addtodoentity(int n, const char *desc);
extern int findtype(const char *what);
extern int findentity(int type, int index = 0);
extern int findentity(int type, int index, uchar attr2);
+36
View File
@@ -524,6 +524,42 @@ void enumentities(char *type)
}
COMMAND(enumentities, "s");
vector<int> todoents;
vector<char *> todoentdescs;
void cleartodoentities(const char *n)
{
int ni = n ? ATOI(n) : -1;
if(!n || !*n || ni < 0)
{
todoents.setsize(0);
todoentdescs.deletearrays();
}
else loopvrev(todoents) if(todoents[i] == ni)
{
todoents.remove(i);
delstring(todoentdescs.remove(i));
}
}
COMMAND(cleartodoentities, "s");
void addtodoentity(int n, const char *desc)
{
todoents.add(n);
todoentdescs.add(newstring(desc));
}
COMMANDF(addtodoentity, "is", (int *n, const char *desc) { if(ents.inrange(*n)) addtodoentity(*n, desc); });
void enumtodoentities()
{
vector<char> res;
loopv(todoents) cvecprintf(res, "%d %s\n", todoents[i], escapestring(todoentdescs[i], true));
if(!res.length()) res.add('\0');
else res.last() = '\0';
result(res.getbuf());
}
COMMAND(enumtodoentities, "");
void scalecomp(uchar &c, int intens)
{
int n = c*intens/100;
+18 -4
View File
@@ -874,6 +874,7 @@ int load_world(char *mname) // still supports all map formats that have e
mapoverride_nostencilshadows = (hdr.flags & MHF_DISABLESTENCILSHADOWS) ? 1 : 0;
// read and convert all entities
cleartodoentities();
persistent_entity *tempents = new persistent_entity[hdr.numents];
bool oldentityformat = hdr.version < 10; // version < 10 have only 4 attributes and no scaling
loopi(hdr.numents)
@@ -899,7 +900,8 @@ int load_world(char *mname) // still supports all map formats that have e
if((ss = abs(entwraparound[e.type][x - 1] / entscale[e.type][x - 1]))) e.attr##x = (int(e.attr##x) % ss + ss) % ss; \
e.attr##x = ov = e.attr##x * entscale[e.type][x - 1]; \
if(ov != e.attr##x) { conoutf("overflow during conversion of attr%d of entity #%d (%s): value %d can no longer be represented - pls fix manually before saving the map",\
x, i, entnames[e.type], oe.attr##x); e.attr##x = oe.attr##x; res |= LWW_ENTATTROVERFLOW; }
x, i, entnames[e.type], oe.attr##x); e.attr##x = oe.attr##x; res |= LWW_ENTATTROVERFLOW; \
defformatstring(desc)("%s: attr%d was %d, value can no longer be represented", entnames[e.type], x, oe.attr##x); addtodoentity(i, desc); }
SCALEATTR(1);
SCALEATTR(2);
SCALEATTR(3);
@@ -1115,6 +1117,8 @@ struct xmap
vector<headerextra *> headerextras;
vector<persistent_entity> ents, delents;
vector<char> mapconfig;
vector<int> todoents;
vector<char *> todoentdescs;
sqr *world;
header hdr;
int ssize, cubicsize, numundo;
@@ -1139,6 +1143,7 @@ struct xmap
vector<uchar> tmp; // add undo/redo data in compressed form as temporary headerextra
numundo = backupeditundo(tmp, MAXHEADEREXTRA, MAXHEADEREXTRA);
headerextras.add(new headerextra(tmp.length(), HX_EDITUNDO, tmp.getbuf()));
loopv(::todoents) { todoents.add(::todoents[i]); todoentdescs.add(newstring(::todoentdescs[i])); }
}
~xmap()
@@ -1148,6 +1153,8 @@ struct xmap
ents.setsize(0);
delents.setsize(0);
mapconfig.setsize(0);
todoents.setsize(0);
todoentdescs.deletearrays();
}
void restoreent(int i)
@@ -1191,6 +1198,8 @@ struct xmap
loadskymap(true);
startmap(name, false, true); // "start" but don't respawn: basically just set clientmap
restoreposition(position);
cleartodoentities();
loopv(todoents) addtodoentity(todoents[i], todoentdescs[i]);
}
void write(stream *f) // write xmap as cubescript to a file
@@ -1228,6 +1237,7 @@ struct xmap
}
delstring(t);
}
loopv(todoents) f->printf("restorexmap todoent %d %s\n", todoents[i], escapestring(todoentdescs[i]));
f->printf("restorexmap position %d %d %d %d %d // EOF, don't touch this\n\n", int(position[0]), int(position[1]), int(position[2]), int(position[3]), int(position[4]));
}
};
@@ -1351,8 +1361,8 @@ COMMANDF(xmap_restore, "s", (const char *nick) // use xmap as current map
void restorexmap(char **args, int numargs) // read an xmap from a cubescript file
{
const char *cmdnames[] = { "version", "names", "sizes", "header", "world", "headerextra", "ent", "delent", "config", "position", "" };
const char cmdnumarg[] = { 3, 2, 3, 0, 0, 1, 11, 11, 1, 5 };
const char *cmdnames[] = { "version", "names", "sizes", "header", "world", "headerextra", "ent", "delent", "config", "todoent", "position", "" };
const char cmdnumarg[] = { 3, 2, 3, 0, 0, 1, 11, 11, 1, 2, 5 };
if(!xmjigsaw || numargs < 1) return; // { conoutf("restorexmap out of context"); return; }
bool abort = false;
@@ -1403,7 +1413,11 @@ void restorexmap(char **args, int numargs) // read an xmap from a cubescript f
case 8: // config
cvecprintf(xmjigsaw->mapconfig, "%s\n", args[1]);
break;
case 9: // position - this is also the last command and will finish the xmap
case 9: // todoent
xmjigsaw->todoents.add(ATOI(args[1]));
xmjigsaw->todoentdescs.add(args[2]);
break;
case 10: // position - this is also the last command and will finish the xmap
{
loopi(5) xmjigsaw->position[i] = ATOI(args[i + 1]);
int i;