return 0;
}
+static MovPosComb just_getmovpos(Segment *d, TrackAdvanceContext *tac) {
+ MovPosComb target;
+ TrackLocation tloc;
+ int r;
+
+ tloc.seg= d;
+ r= resmain_getmovpos(&tloc,tac,&target); assert(!r);
+ return target;
+}
+
static int resolve_complete_main(void) {
int problems, phase, nextphase;
TRAIN_ITERVARS(t);
}
}
- TrackLocation tloc;
+ if (problems) return problems;
+
TrackAdvanceContext tac;
- Segment *interferer;
+ MovPosComb target;
tac.getmovpos= resmain_getmovpos;
- int r;
FOR_SEGMENT(d,NOOP,NOOP) {
if (problems) return problems;
- tloc.seg= d;
d->iselem_u= 0;
- interferer= segment_interferes(&tac,d);
- if (interferer && interferer->i->invertible) {
- actual_inversions_start();
- interferer->seg_inverted= d->seg_inverted;
- actual_inversions_segment(interferer);
- actual_inversions_done();
- }
+ target= just_getmovpos(d,&tac);
- MovPosComb target;
- r= resmain_getmovpos(&tloc,&tac,&target); assert(!r);
+ if (d->i->invertible && target<0) {
+ Segment *interferer= segment_interferes(&tac,d);
+ if (interferer) {
+ actual_inversions_start();
+ d->seg_inverted= interferer->seg_inverted;
+ actual_inversions_segment(d);
+ actual_inversions_done();
+ }
+ }
if (d->i->n_poscombs>1) {
d->movposcomb= -1;