also, ich denke 20 traces schafft a6 locker jeden frame. Obwohl... ich weis es nicht. Außprobieren!

Aber 2 ist garantiert kein problem

Stimmt, es müsste vorne am wagen sein. Aber 1 trace reicht immer noch, da er die daten ja nicht aus den resultaten der traces bekommt, sondern aus der schiene.
Ja, du müsstest bei jeder kurve angeben, wie groß der winkel ist. Aber das dürfte kein problem sein, einfach etwas rumprobieren, ausrechnen würde ich das nicht. Ein paar mal im kreis fahren lassen, und wenn er dann noch auf den schienen ist stimmts. Außerdem kannst du eine korrektur irgendwie vornehmen, jedesmal wenn es auf eine gerade kommt. So wird auch die kleinste abweichung dann behoben.
Weichen sind mit dem prinzip auch kein problem, du musst einfach den "kurvenwert" der weiche ändern, je nachdem in welche richtung sie zeigt.
Ich hab grad irgendwie lust auf coden

:
Code:
define schienentyp,skill1;
define kurve,1; //ich hab bemerkt, das die richtung eigentlich egal ist: einfach den wert in eine richtung negativ machen...
define gerade,2;
define fahrtrichtung,skill2; //achtung! vector, belegt also skill2,3 und 4.
define kurvenwinkel,skill5;
define geschwindigkeit,skill6;
action gerade
{
my.schienentyp = gerade;
my.kurvenwinkel = 0;
}
action kurve_rechts
{
my.schienentyp = kurve;
my.kurvenwinkel = -30;
}
action kurve_links
{
my.schienentyp = kurve;
my.kurvenwinkel = 30;
}
//das hier kommt in die action des zuges:
my.geschwindigkeit = 10;
while(1)
{
you = null;
c_trace(my.x,vector(my.x,my.y,my.z-500),ignore_me + ignore_passable);
if(you) //wenn schiene gefunden wurde
{
if(you.schienentyp == gerade)
{
vec_for_angle(my.fahrtrichtung,you.pan);
}
if(you.schienentyp == kurve)
{
vec_set(temp,vector(you.kurvenwinkel,0,0);
vec_rotate(my.fahrtrichtung,temp);
}
}
else //keine schiene gefunden, ich bin also nicht auf den gleisen
{
vec_set(my.fahrtrichtung,nullvector); //stoppe den zug.
}
vec_normalize(my.fahrtrichtung,my.geschwindigkeit);
vec_set(temp,my.fahrtrichtung);
vec_normalize(temp,time_step);
c_move(my,nullvector,temp,ignore_passable+glide);
wait(1);
}
keine ahnung ob das geht oder nicht... aber du kannst's ja mal ausprobieren^^