*/
#define iselem_u mark0
+static int resmain_getmovpos(TrackLocation *t, TrackAdvanceContext *c,
+ MovPosComb *use_io) {
+ Segment *d= t->seg;
+
+ if (d->home && d->home->resolution == RR_H) {
+ d->tr_backwards= d->ho_backwards;
+ *use_io= 0; /* a bit kludgey */
+ } else if (d->owner) {
+ d->tr_backwards ^= d->owner->backwards;
+ *use_io= d->movposcomb;
+ } else {
+ *use_io= -1;
+ }
+ return 0;
+}
+
static int resolve_complete_main(void) {
int problems, phase, nextphase;
TRAIN_ITERVARS(t);
}
}
+ TrackLocation tloc;
+ TrackAdvanceContext tac;
+ Segment *interferer;
+ tac.getmovpos= resmain_getmovpos;
+ int r;
+
FOR_SEGMENT(d,NOOP,NOOP) {
- if (problems)
- return problems;
+ if (problems) return problems;
+ tloc.seg= d;
d->iselem_u= 0;
- MovPosComb target= -1;
-
- if (d->home && d->home->resolution == RR_H) {
- d->tr_backwards= d->ho_backwards;
- target= 0; /* a bit kludgey */
- } else if (d->owner) {
- d->tr_backwards ^= d->owner->backwards;
- target= d->movposcomb;
+ 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();
}
+ MovPosComb target;
+ r= resmain_getmovpos(&tloc,&tac,&target); assert(!r);
+
if (d->i->n_poscombs>1) {
d->movposcomb= -1;
if (target >= 0) {