yeh so i did another test with noderanks 2..5 (Soldier through Medic) (civ/scout nodes appear to be ignored for this)
the Hallucinoid terrorist spawned at Soldier node, and if no Soldier node is present then at Medic node, then Squad Leader node, then at Navigator/Commander node ...
ignoring the Terrorist2 spawnnode until all the others were set to civ/scout ...
[edit]
it looks like these lines in the hardcode are responsible:
Savegame/Node.cpp
const int Node::nodeRank[8][7] =
// ..
{ NR_SOLDIER, NR_ENGINEER, NR_NAVIGATOR, NR_LEADER, NR_MISC1, NR_MISC2, NR_SCOUT }, //terrorist
{ NR_SOLDIER, NR_ENGINEER, NR_NAVIGATOR, NR_LEADER, NR_MISC1, NR_MISC2, NR_SCOUT } //also terrorist
ie. terrorists spawn at Soldier nodes preferentially ... (note that those constants are based on UFO but translate to TFTD ranks, with (ufo)Engineer as (tftd)Medic, etc)
[edit2]
here's the (rewritten) table in my personal build:
const int Node::nodeRank[8u][8u]
{
{ NR_LEADER, NR_NAVIGATOR, NR_ENGINEER, NR_SOLDIER, NR_MEDIC, NR_MISC2, NR_MISC1, NR_SCOUT }, // commander
{ NR_LEADER, NR_NAVIGATOR, NR_ENGINEER, NR_SOLDIER, NR_MEDIC, NR_MISC2, NR_MISC1, NR_SCOUT }, // leader
{ NR_ENGINEER, NR_LEADER, NR_NAVIGATOR, NR_SOLDIER, NR_MEDIC, NR_MISC2, NR_MISC1, NR_SCOUT }, // engineer
{ NR_MEDIC, NR_NAVIGATOR, NR_ENGINEER, NR_LEADER, NR_SOLDIER, NR_MISC2, NR_MISC1, NR_SCOUT }, // medic
{ NR_NAVIGATOR, NR_LEADER, NR_ENGINEER, NR_SOLDIER, NR_MEDIC, NR_MISC2, NR_MISC1, NR_SCOUT }, // navigator
{ NR_SOLDIER, NR_ENGINEER, NR_NAVIGATOR, NR_MEDIC, NR_LEADER, NR_MISC2, NR_MISC1, NR_SCOUT }, // soldier
{ NR_MISC1, NR_MISC2, NR_SOLDIER, NR_ENGINEER, NR_NAVIGATOR, NR_LEADER, NR_MEDIC, NR_SCOUT }, // terrorist1
{ NR_MISC2, NR_MISC1, NR_SOLDIER, NR_ENGINEER, NR_NAVIGATOR, NR_LEADER, NR_MEDIC, NR_SCOUT } // terrorist2
};
but it has 8 ranks in the 2nd dimension .....