Here is a MetaPost attempt—mostly copied-pasted from Thruston's program with his permission— which aims at managing the labels more easily.
The main change is its use of the latexmp package. I think it makes labels easier to implement, firstly because latexmp, as its name hints at, uses LaTeX to typeset them.
For that purpose it introduces the textext function as a replacement of the btex … etex flags. It is much more flexible since it takes a string as argument, allows inclusion inside loops and can be used as a replacement of the infont operator (i.e, with the textextlabel option key set to enable, each string inside label(" ", — ) instruction is typeset automatically with textext).
Its drawback is that you need to run the MetaPost program twice to produce the labels. This also can be automatized, by setting the mode option key to rerun.
Hence I've provided textext functions to each labelling instruction, which had to be done explicitly for each box definition (since they don't make use of real label instruction), but could be implicitly done for each label instructions, which remain unchanged thus.
As this program uses LaTeX, the use of Helvetica is done with the loading of the helvet LaTeX package and the instruction
\renewcommand{\familydefault}{\sfdefault}
I also redefined the \lbb command as a LaTeX environment which produces multi-lined output via a tabular environment.
\newenvironment{lbb}{\begin{tabular}{c}}{\end{tabular}}
The rest of Thruston's program is unchanged and as such the same figure is produced, more or less (the boxes are not drawn with exactly the same dimensions, probably because the spacing caused by the LaTeX tabular environment is different).
Using LuaLaTeX and the luamplib package would have made the labels management yet much more easier, but I think that a LuaLaTeX solution is a bit too "specific" to be recommended as an answer for that sort of question (the engine used has not been specified).
prologues := 3;
outputtemplate := "%j%c.eps";
input boxes; % use the boxes library
input latexmp;
setupLaTeXMP(textextlabel = enable,
mode = rerun,
packages = "helvet",
preamble = ("\renewcommand{\familydefault}{\sfdefault}"
& "\newenvironment{lbb}{\begin{tabular}{c}}{\end{tabular}}"));
beginfig(1);
% define the boxes
boxit.ant(textext("\begin{lbb} Anticipatory \\ influences \end{lbb}"));
boxit.imm(textext("\begin{lbb} Immediate \\ emotions \end{lbb}"));
boxit.dec(textext("\begin{lbb} Decision/ \\ behaviour \end{lbb}"));
boxit.con(textext("\begin{lbb} Expected \\ consequences \end{lbb}"));
boxit.emo(textext("\begin{lbb} Expected \\ emotions \end{lbb}"));
boxit.inc(textext("\begin{lbb} Incidental \\ influences \end{lbb}"));
% layout the boxes by relating the centres to each other
ant.c = .8[imm.c,dec.c] + 64 up; inc.c + 64 up = imm.c;
imm.c - dec.c = dec.c - con.c = con.c - emo.c = 90 left;
% draw all the boxes, you could colour them etc here as well
forsuffixes x = ant, imm, dec, con, emo, inc:
drawboxed(x);
endfor
% define the connection paths
path p[];
p1 = emo.c {up} .. {left} con.n shifted 20up .. {down} dec.c cutbefore bpath emo cutafter bpath dec;
p2 = con.n {up} .. {left} ant.e;
p3 = emo.n {dir 110} .. {left} ant.e;
p23 = ant.w {left} .. {down} imm.c cutafter bpath imm;
p4 = imm.e -- dec.w;
p5 = dec.e -- con.w;
p6 = con.e -- emo.w;
p7 = inc.n -- imm.s;
p8 = imm.c {dir -40} .. {dir 70} con.c cutbefore bpath imm cutafter bpath con;
p9 = imm.c {dir -40} .. {dir 70} emo.c cutbefore bpath imm cutafter bpath emo;
% draw and label the paths, doing the crossing neatly
drawarrow p1; label.ulft("a", point 1.7 of p1);
undraw subpath(0.1,0.9) of p2 withpen pencircle scaled 3bp;
draw p2; label.urt("b", point 0.4 of p2);
drawarrow p3; label.top ("c", point 0.6 of p3);
drawarrow p23; label.ulft("b,c", point 0.7 of p23);
drawarrow p4; label.top ("d", point 0.5 of p4);
drawarrow p5; label.top ("e", point 0.5 of p5);
drawarrow p6; label.top ("f", point 0.5 of p6);
drawarrow p7; label.rt ("g", point 0.5 of p7);
drawarrow p8; label.ulft("h", point 0.8 of p8);
drawarrow p9; label.ulft("i", point 0.8 of p9);
endfig;
end.
