798 @verb #5252:"update_users" this none none rxdo #562 @program #5252:"update_users" this none none "Totally rewritten by whiz.kid." "This evil verb updates the usage list on a #5252. It does this by creating a bit of code and storing it in a string; then it evaluates the code (!) This is further complicated by the fact that eval does not permit arguments, so I used text substitution à la substitute(). Nifty, eh?" player:tell("Updating user list for ", this.name, ". This may take a while.") players = players() numplayers = length(players) tq = (q = (h = numplayers / 2) / 2) + h {q0, q1, h0, h1, t0, t1} = {tostr(q), tostr(q + 1), tostr(h), tostr(h + 1), tostr(tq), tostr(tq + 1)} useless = {{0, -1}, {0, -1}, {0, -1}, {0, -1}, {0, -1}, {0, -1}, {0, -1}} np = tostr(numplayers) users = {} code = "players = players(); users = {}; for x in [%1..%2] if (%3 in `players[x].features ! E_PROPNF => {}') users = {@users, players[x]}; endif endfor return users;" code = substitute(code, {1, length("%1%2" + tostr(this)), {{1, 2}, {3, 4}, {5, length("%1%2" + tostr(this))}, @useless[2..$]}, "%1%2" + tostr(this)}) users = {@users, @eval(substitute(code, {1, length(q0), {{1, 1}, {2, length(q0) + 1}, @useless}, "1" + q0}))[2]} player:Tell("Still updating users; about one-quarter done") users = {@users, @eval(substitute(code, {1, length(q1 + h0), {{1, length(q1)}, {length(q1) + 1, length(q1 + h0)}, @useless}, q1 + h0}))[2]} player:tell("Still updating users; about one-half done") users = {@users, @eval(substitute(code, {1, length(h1 + t0), {{1, length(h1)}, {length(h1) + 1, length(t0 + h1)}, @useless}, h1 + t0}))[2]} player:tell("Still updating users; about three-quarters done") users = {@users, @eval(substitute(code, {1, length(t1 + np), {{1, length(t1)}, {length(t1) + 1, length(t1 + np)}, @useless}, t1 + np}))[2]} player:tell("Done updating user list for ", this:title(1), "...") this.users = users . 0