From: ian Date: Mon, 5 May 2008 11:12:57 +0000 (+0000) Subject: set polarity of interferers during resolution (involves breaking out resmain_getmovpos) X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=1afd85f69c39ea350730e573c7d786eda21a280b;p=trains.git set polarity of interferers during resolution (involves breaking out resmain_getmovpos) --- diff --git a/hostside/resolve.c b/hostside/resolve.c index 1909396..151c471 100644 --- a/hostside/resolve.c +++ b/hostside/resolve.c @@ -155,6 +155,22 @@ */ #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); @@ -294,22 +310,29 @@ static int resolve_complete_main(void) { } } + 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) {